Объект не существует после конструктора? - PullRequest
0 голосов
/ 03 апреля 2010

У меня есть конструктор, который выглядит следующим образом (в C ++):

Interpreter::Interpreter() {
        tempDat == new DataObject();
        tempDat->clear();
}

конструктор dataObject абсолютно ничего не делает, и clear делает это:

bool DataObject::clear() {
        //clear the object

        if (current_max_id > 0) {
            indexTypeLookup.clear();
            intData.clear();
            doubleData.clear();
            current_max_id = 0;
        }

}

Эти члены определены следующим образом:

std::map<int, int> indexTypeLookup;
std::map<int, int> intData;
std::map<int, double> doubleData;

Теперь странно то, что я получаю segfault на tempDat-> clear (); GDB говорит, что tempDat является нулевым. Как это возможно? Конструктор tempDat не может выйти из строя, он выглядит так:

DataObject::DataObject() : current_max_id(0)
{

}

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

1 Ответ

3 голосов
/ 03 апреля 2010
Interpreter::Interpreter() {
        tempDat == new DataObject(); // <- here
        tempDat->clear();
}

Вы используете == для назначения. Используйте = вместо:

        tempDat = new DataObject();

Использование == дает вам выражение, которое сравнивает текущее значение tempDat (некоторый случайный мусор) с адресом вновь созданного DataObject. Результат этого выражения немедленно отбрасывается, а tempDat остается без изменений. Таким образом, он по-прежнему содержит случайный мусор, который оказался 0 в вашем сеансе отладки.

...