Недопустимый нулевой указатель — C — VS2010

#c #pointers #map #null

#c #указатели #словарь #null

Вопрос:

Я получаю Assertion failed сообщение об ошибке Expression: invalid null pointer , и оно указывает на c:program filesmicrosoft visual studio 10.0vcincludexstring line:930 .

Вот мой код:

 void main(void)
    {
    // fillMap() fills map with data from txtfile and returns map<char,int> 
    map<char, int> myMap = fillMap("file.txt");   // <- takes a string

    MyClass *myObject;
    // Code reaches here fine
    myObject= new MyClass(myMap);    // this line causes the error
    // Does not get to here
    }
  

В строке, которая вызывает ошибки, я могу оставить constructor() пустым и просто сказать ptr = new MyClass(); и все равно получить ту же ошибку. Я думаю, что это как-то связано с моим конструктором в любом случае.

В MyClass определение конструктора является MyClass(char=' ', int=0) . Если я не даю им значения, то я получаю No default constructor ошибку.

Итак, может ли кто-нибудь сказать мне, как я могу отследить эту ошибку в Visual Studio 2010, или предоставить возможное решение относительно того, почему у меня возникают эти проблемы?

PS, это не позволит мне создавать новые объекты, которые не являются указателями, Error: No operator "=" matches these operands .

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ: если это поможет, вот строка 930 из xstring:

 _Mytamp; assign(const _Elem *_Ptr)
    {   // assign [_Ptr, <null>)
    _DEBUG_POINTER(_Ptr);      //930
    return (assign(_Ptr, _Traits::length(_Ptr)));
    }
  

Комментарии:

1. не могли бы вы опубликовать код для этого конструктора?

2. (char,int) Конструктор — это не тот, который вы вызываете. Существует ли конструктор, который принимает map<char,int> ?

Ответ №1:

Основываясь на том факте, что сбой происходит в функции с именем assign , я подозреваю, что MyClass (прямо или косвенно) содержит элемент указателя, но вы не определили оператор присваивания (и, возможно, ни конструктор копирования, ни деструктор) должным образом. На самом деле, вы пишете

это не позволит мне создавать новые объекты, которые не являются указателями, ошибка: ни один оператор «=» не соответствует этим операндам.

Если вы пытались создать свой объект следующим образом

 MyClass myObject = MyClass(myMap);
  

приведенная выше ошибка компилятора действительно означает, что не найден подходящий оператор присваивания для присвоения временного значения, созданного MyClass(myMap) для myObject . В этом случае,

 MyClass myObject(myMap);
  

следует скомпилировать (хотя, тем не менее, это, вероятно, привело бы к сбою таким же образом).

Не видя фактического кода вызываемого вами конструктора, невозможно точно сказать, почему происходит сбой.

Комментарии:

1. В инструкции нет присваивания MyClass myObject = MyClass(myMap);

2. Привет, спасибо. Это была проблема в самом конструкторе. Я тупо использовал одно и то же имя для 2 объектов разных типов! Один указан как private в классе, а другой объявлен в конструкторе, поэтому компилятор запутался! Очень глупо с моей стороны! И, во-вторых, я инициализировал строку в NULL в конструкторе, что ей не понравилось! Сейчас он у меня запущен без ошибок. Еще раз спасибо!