C++发布与调试,内存分配,跳过构造函数

Gig*_*igi -1 c++ constructor memory-leaks visual-studio-2010

这是我上一个问题的后续内容: C++完全系统崩溃,仅发布模式

基本上我有一个树状数据结构,在Release模式下,它完全冻结了操作系统.这是由于内存分配突然激增,超出了操作系统可以处理的范围.

这看似内存泄漏(它是,但在一分钟内更多)是非常奇怪的,因为我有所有必要的代码来初始化指向NULL并最终分配它们(必要时)如果它们被发现是NULL.在调试模式下,确认了这个正确的行为,并且事情分配正常(我可以看到调试器中的NULL指针设置为零).

但在发布模式中,情况有所不同.构造函数被完全跳过,并且所有类的内部都被初始化为随机垃圾.这会导致指针变得混乱,这就是内存被分配的地方,直到整个系统崩溃.

为什么Release模式忽略了我的构造函数?

我在Windows 7上使用Visual Studio 2010顺便说一句.

Max*_*kin 5

从(不完整)代码判断:

template <class NodeData> struct OctNode {
        OctNode() {
                for (int i = 0; i < 8; ++i)
                        children[i] = NULL;
        }
        ~OctNode() {
                for (int i = 0; i < 8; ++i)
                        delete children[i];
        }
        OctNode *children[8];
        vector<NodeData> data;
};
Run Code Online (Sandbox Code Playgroud)

分配OctNode给另一个时,它可能会泄漏内存.编译器生成默认的复制构造函数和赋值运算符.后者可能会导致内存泄漏,因为它不会释放先前分配的内存.我建议将类定义更改为以下内容:

template <class NodeData> struct OctNode {
        OctNode() : children() {} // zero-initialize children
        ~OctNode() {
                for (int i = 0; i < 8; ++i)
                        delete children[i];
        }
        OctNode *children[8];
        vector<NodeData> data;
    private:
        OctNode(OctNode const&);
        OctNode& operator=(OctNode const&);
};
Run Code Online (Sandbox Code Playgroud)

并编译你的代码.如果由于OctNode& operator=(OctNode const&)是私有而无法编译,则导致泄漏.