我有一个看起来像这样的构造函数(在c ++中):

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


dataObject的构造函数绝对不执行任何操作,并且清除此操作:

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;


现在奇怪的是,我在tempDat-> clear();上遇到了段错误。 gdb说tempDat为空。那怎么可能? tempDat的构造函数不会失败,它看起来像这样:

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

}


我知道可能会有更好的方法来制作这样的数据结构,但是我真的很想知道此段错误的来源。

最佳答案

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


您正在使用==进行分配。使用=代替:

        tempDat = new DataObject();


使用==为您提供一个表达式,该表达式将tempDat的当前值(一些随机垃圾)与新创建的DataObject的地址进行比较。该表达式的结果将立即被丢弃,并且tempDat保持不变。因此它仍然包含随机垃圾,在您的调试会话中恰巧是0

07-26 05:09