C++ 指针和删除

标签 c++ pointers memory

这是我拥有的一些代码的简化版本。由于 class A 中的 pointerB 设置为指针 beta,在客户端代码中指向分配的内存,我是否必须释放内存class A 的析构函数中的 pointerB 是否也被删除了?

class A{
   public:
     A(B* beta){
        pointerB = beta;
     }
     ~A(){

      /*
      would deleting pointerB be necessary
      */

      }

     B* pointerB;
};
class B{
   public:
     B();
};

//client code
B* beta = new B();
A* alpha = new A(beta);    

//do stuff
delete beta;
delete alpha;
beta = NULL;
alpha = NULL;

最佳答案

对于每个 new,在您的应用程序执行期间必须有且只有一个 delete

因此,无论是在析构函数中调用 delete pointerB 还是在外部调用 delete beta 都没有关系。因为这里释放的是同一个内存!问题是 A 是否“拥有”B 的一个实例(因此负责释放它使用的内存)或者 A 是否仅引用 B 的一个实例(例如,当 beta 仍在使用时被删除)。

但是(正如 Roger 已经指出的那样)我建议阅读 std::shared_ptrstd::unique_ptr 的文档。这里例如:http://en.cppreference.com/w/cpp/memory在大多数情况下,您可以充分利用这些,而不必关心内存管理。

关于C++ 指针和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16933005/

相关文章:

c++ - 指向两个不同结构的指针

c++ - 紧凑的偏移指针,现有的实现?

c++ - 需要干净地替换对 std::copy 可能不安全的调用

c++ - 类(class)访问违规阅读位置

C++ 在 OS X 中移植 VirtualFree

c++ - 不要在最后一个数字后打印空格

c++ - Excel 不会从 C++ DLL 加载函数

c++ - 无法编译内核头文件(libc6-amd64 依赖项)

C++将带有单词和数字的字符串转换为数字

c++ - 在 Arduinos 上,函数内的变量是否始终保留在 RAM 中?