我有一个看起来像这样的构造函数(在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
。