C ++ new()在调用ctor之前崩溃了

时间:2011-04-04 16:32:46

标签: c++ constructor new-operator sigsegv

感谢您查看我的问题。

我有一个在我的程序中动态创建的对象。创建是循环的一部分,第一次迭代工作正常。

创建后,我的对象基类将自己添加到地图中。

以下是一些示例代码:

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

你如何破坏堆,我怎么能发现腐败已经发生?

2 个答案:

答案 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;
}