【问题标题】:Confusion about Memory deallocation in C++关于 C++ 中内存释放的困惑
【发布时间】:2014-04-11 03:20:40
【问题描述】:

我对 C++ 中的内存取消分配有些困惑。我有一个结构

struct Node{
    Node* left;
    Node* right;
};

我声明一个 Node 类型的指针为:

struct Node* myNode = new Node;

现在,如果我执行delete myNode,它是否还会取消分配myNode 内的leftright 指针?如果没有,如果我们在Node 类型内部有很多指针,并且在没有内存泄漏的情况下编写代码会非常困难,那不是很繁琐吗?

【问题讨论】:

  • free() 释放 myNode 指向的内存块。它不关心左右

标签: c++ pointers memory-management new-operator delete-operator


【解决方案1】:

不,它不会破坏或释放它们。但是,对于这种情况,您可以编写析构函数:

~Node()
{
    delete left;
    delete right;
}

更好的方法是使用智能指针,如 std::shared_ptrstd::unique_ptr

【讨论】:

  • 虽然它使代码更清晰,但检查空指针是不必要的。见en.cppreference.com/w/cpp/memory/new/operator_delete
  • 检查 null 会使代码不太清晰。我们是否正在解决自定义分配器中的错误?为什么那行代码在那里?在我们的代码库中看到这一点会让我感到不安。
  • @Xenotoad 抱歉,我不知道 delete 检查 nullptrs,我将删除 if 子句
  • 即使我已经使用“delete myNode”删除了 myNode 指针,我仍然可以调用“myNode->left”而不会出现任何错误。我的理解是,如果使用删除释放内存,再次尝试使用它会导致分段错误。但我在这里看到的情况并非如此。
  • @azizulfahim 其未定义的行为。干脆不做。但是为了解释:myNode->left 只会取消引用 myNode 而不是 left。请注意,即使在删除 myNode 之后仍然具有旧值,因此指向旧内存位置。如果幸运的话,myNode 指向的内存区域在页面保护方面仍然“有效”。由于操作系统通常不会用零覆盖未分配的内存(因为它是不必要的),因此取消引用可能仍然有效,因为内存尚未被其他代码覆盖。
猜你喜欢
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多