内存管理指针

Memory management pointers

本文关键字:指针 管理 内存      更新时间:2023-10-16

我看到了一种常见的做法,即删除指针amd,使其在析构函数中为空,即使没有为堆上的指针分配内存。请考虑以下C++代码:

哑巴.h

class dummy
{
     int* a;
}

假人.cpp

  dummy::dummy():a(NULL)
   { cout<<Inside Const"; }
   dummy::~dummy()
  {
    if(a!=NULL)
    {
      delete a;
      a = NULL;
    }
  }
  bool func()
  {
     a = func1();
  }

在上面的代码中,虽然内存没有分配给堆,但即使这样它也会被删除。它不应该导致内存泄漏吗?

让它为空是完全没有意义的,因为它即将被摧毁。

如果代码为 null,则您的代码不会删除它,因为if (a!=NULL) .但是,这也是毫无意义的:将 delete 应用于 null 指针将什么都不做,因此您可以将析构函数简化为无条件delete a;(假设您知道它要么为 null,要么指向使用 new 创建的对象)。

根据三法则,您确实需要确保您的类不可复制或具有有效的复制语义;否则,复制对象将导致删除相同的内存两次,这是不允许的。

更好的是,停止杂耍指针,并使用智能指针,容器和其他RAII类型,使生活更加简单。

您永远不应该在指向不是堆分配对象的对象的指针上调用 delete。 如果这样做,程序可能会忽略该行。 或者它可能会擦除您的硬盘驱动器。 或者它可能会忽略您计算机上的该行,并且在您将程序交给朋友后,它会擦除他们的硬盘驱动器。 别这样。

相关:您的类缺少复制构造函数和复制赋值,当您有一个管理内存的指针时,这是至关重要的。 或者,将int*杆件替换为unique_ptr<int>杆件,该杆件为您管理构造和移动。