Gig*_*igi -1 c++ constructor memory-leaks visual-studio-2010
这是我上一个问题的后续内容: C++完全系统崩溃,仅发布模式
基本上我有一个树状数据结构,在Release模式下,它完全冻结了操作系统.这是由于内存分配突然激增,超出了操作系统可以处理的范围.
这看似内存泄漏(它是,但在一分钟内更多)是非常奇怪的,因为我有所有必要的代码来初始化指向NULL并最终分配它们(必要时)如果它们被发现是NULL.在调试模式下,确认了这个正确的行为,并且事情分配正常(我可以看到调试器中的NULL指针设置为零).
但在发布模式中,情况有所不同.构造函数被完全跳过,并且所有类的内部都被初始化为随机垃圾.这会导致指针变得混乱,这就是内存被分配的地方,直到整个系统崩溃.
为什么Release模式忽略了我的构造函数?
我在Windows 7上使用Visual Studio 2010顺便说一句.
从(不完整)代码判断:
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&)是私有而无法编译,则导致泄漏.
| 归档时间: |
|
| 查看次数: |
1096 次 |
| 最近记录: |