【发布时间】:2015-04-30 16:24:46
【问题描述】:
我有两个相互关联的问题。
我正在实现一个区域四叉树结构。在这个 QTree 类中,我有一些字段,更重要的是一个
vector<QTree*> quads;
包含当前正方形的四个划分区域的字段。 首先,我想为这个类实现一个析构函数。请注意,我无法在类的公共字段中定义任何内容(如果我是,这简直是小菜一碟!)所以我这样做了:
QTree::~QTree ()
{
if ( quads [ 0 ] != NULL )
{
for ( int i = 0; i < 4; i++ )
{
delete ( quads [ i ] );
}
}
}
根据 valgrind,这是可行的。没有内存泄漏和错误,但我不太确定是否如此。您能否就析构函数的有效性发表您的看法?
第二个问题是,在这个类的重载赋值运算符的实现中,如果我在自赋值检查之后和这个方法中的任何其他内容之前写这个:
delete this;
我拿
* ` ' 中的错误:双重释放或损坏(输出):0x00007fffcb4d46d0 * :第 3 行:4227 中止(核心转储)泄漏检查
错误。
如果我写(析构函数中的代码相同。)
if ( quads [ 0 ] != NULL )
{
for ( int i = 0; i < 4; i++ )
{
delete ( quads [ i ] );
}
}
而不是“删除这个;”在重载的赋值运算符中,我没有收到错误。 有什么问题,能解释一下吗?
编辑: 我删除了复制构造函数。
也许问题在于使用对象的自毁。以下是一些有用的信息:https://isocpp.org/wiki/faq/freestore-mgmt#delete-this
【问题讨论】:
-
class QTree的数据成员是什么? -
if ( quads [ 0 ] != NULL)那里有大红旗。 -
@timrau 除了四边形,它们都是堆栈变量。我想,这就是你要问的问题。
-
@self 我不明白你的意思,但让我提一下一个重要问题。 quads 向量被初始化为在构造函数中保存 4 个 NULL 指针。当一个正方形被分割时,这个向量中的指针被动态分配来保存新的 QTree 的正方形的值。
标签: c++ pointers memory-management quadtree