感谢您查看我的问题。
我有一个在我的程序中动态创建的对象。创建是循环的一部分,第一次迭代工作正常。
创建后,我的对象基类将自己添加到地图中。
以下是一些示例代码:
public class Base {
Base() {
// Add itself to a map
Data::objects[key] = this;
}
}
public class Derived : public Base {
// This ctor only initialize one int field.
Derived() : Base() {};
}
有点简单不是吗?
在我的代码中,我做Derived * d = new Derived();
并且出于某种愚蠢的原因,我得到了一个SIGSEGV。
我尝试调试它,但它甚至在崩溃之前都没有进入ctor!
这是我的调用堆栈,因此您可以更好地帮助我:
地址:@ 0x002c0000
NTDLL!RtlReleasePebLock()
地址:@ 0x0000000c at c:... \ stl_deque.h:514
msvrct!malloc()函数
的libstdc ++ - 6 _Znwj()
fu87 _ZSt4cerr(这= 0xbc1ad8,e =“//我的对象名称//”)//我的对象名//。cpp
......其他是我的台词。
谢谢你,Micael
{享受}
编辑:添加有关地图的信息
地图静态地位于数据类中。
// Data.h
class Data {
static map<int, Base*> objects;
}
// Data.cpp
#include "Data.h"
map<int, Base*> Data::objects;
// methods implementations
你如何破坏堆,我怎么能发现腐败已经发生?
答案 0 :(得分:2)
您可能在分配之前的某个时刻损坏了堆,这会导致崩溃。尝试使用valgrind运行,看看你出错的地方
答案 1 :(得分:2)
在创建Data::objects
的任何用法之前,Base
已初始化了吗?
如果您在最终链接目标中有多个翻译单元(读取,objects
文件),则无法保证已初始化类对象.cpp
,除非您已进入特殊状态努力确保它。
大多数人通过使用静态类来解决此问题,通过该静态类可以确保在首次使用时发生此初始化。类似的东西:
// untested code, typed in by hand, not compiled through a machine compiler.
class Base {
public: static addObject(Base* that);
Base::Base() { Base::addObject(this); }
};
class Derived: public Base {
Derived::Derived() {}
};
//
// and in the .CPP for Base
namespace /* hidden */ {
int object_number = 0;
map<int,Base*> *objects = NULL;
}
void Base::addObject(Base* that) {
// TODO: do something to avoid multi-thread issues if that is ever a concern
if (!objects) {
objects = new map<int,Base*>();
}
(*objects)[++object_number] = that;
}