c++ - 在C++中的赋值运算符重载方法中删除旧的动态分配内存

标签 c++ pointers memory-management quadtree

我有两个相互关联的问题。

我正在实现一个区域四叉树结构。在这个 QTree 类中,我有一些字段,更重要的是一个

vector<QTree*> quads; 

包含当前方 block 的四个分割区域的字段。 首先,我想为这个类实现一个析构函数。请注意,我不能在类里面的公共(public)领域定义任何东西(如果我是,这是小菜一碟!)所以我这样做了:

QTree::~QTree ()
{
  if ( quads [ 0 ] != NULL )
  {
     for ( int i = 0; i < 4; i++ )
     {
        delete ( quads [ i ] );
     }
  } 
}

根据 valgrind,这有效。没有内存泄漏和错误,但我不太确定是否是。你能谈谈你对析构函数有效性的看法吗?

第二个问题是,在这个类的重载赋值运算符的实现中,如果我在自赋值检查之后和这个方法中的任何其他内容之前写这个:

delete this;

我接受

* ` ' 中的错误:双重释放或损坏(输出):0x00007fffcb4d46d0 * : 第 3 行:4227 Aborted (core dumped) leakcheck

错误。

如果我写(析构函数中的相同代码。)

if ( quads [ 0 ] != NULL )
    {
        for ( int i = 0; i < 4; i++ )
        {
            delete ( quads [ i ] );
        }
    }

而不是“删除这个;”在重载的赋值运算符中,我没有得到任何错误。 怎么了,你能给我解释一下吗?

编辑: 我删除了复制构造函数。

也许问题在于使用对象的自毁。这里有一些有用的信息:https://isocpp.org/wiki/faq/freestore-mgmt#delete-this

最佳答案

在现代 C++ 中,除非在非常特殊的情况下,否则您应该使用智能指针 类来管理拥有指针,例如 std::unique_ptrstd: :shared_ptr.

请注意,STL 智能指针可以与 STL 容器很好地结合,从而可以实现一种“确定性(基于引用计数)垃圾收集器”

在你的情况下,我会考虑使用:

// Supports copy semantics
std::vector<std::shared_ptr<QTree>> quads;

或:

// This is movable but not copyable
std::vector<std::unique_ptr<QTree>> quads;

取决于您的需求和设计。

这样,您就可以享受所谓的"Rule of Zero"了。 : C++ 编译器将自动为您实现复制构造函数、移动构造函数、复制赋值、移动赋值和析构函数。

关于c++ - 在C++中的赋值运算符重载方法中删除旧的动态分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29972986/

相关文章:

arrays - 使用数组和指针的龟兔赛跑

c++ - 动态分配的数组只显示最后的结果

C++:追加到前面,添加到后面的int数组

c++ - 如何在构造函数中正确初始化wchar_t指针并在析构函数中删除它

c++ - Qt:字段类型不完整

c++ - 在 C++ 中,对象是如何存储在内存中的?

c++ - 正确分配和释放子类 QCPGraph

python - 在 C++ 中的 PyObject 上调用 `+=`

c - 如何修改已传递给 C 函数的指针?

C 编程 - 结构、指针和初始化