【问题标题】:deleting object pointer referring by two pointers删除由两个指针引用的对象指针
【发布时间】:2011-04-16 01:58:06
【问题描述】:

我有一个对象说。

ClassA *obj1 = new ClassA;

ClassA *ptr1 = obj1;
ClassA *ptr2 = obj1;

当我做delete ptr1;时,会影响ptr2吗?如果是这样,什么是正确的解决方案?

【问题讨论】:

标签: c++ memory-management


【解决方案1】:

(假设obj2 应该是obj1

ClassA *x 定义了一个指针,它可以指向ClassA 类型的对象。指针本身不是对象。

new ClassA 分配(并构造)ClassA 类型的实际对象。

所以Class A *obj1 = new ClassA; 行定义了一个指针obj1,然后将其设置为指向一个新分配的ClassA 类型的对象。

Class A *ptr1 = obj1; 行定义了一个指针ptr1,然后将其设置为指向obj1 所指向的同一对象,即我们刚刚创建的ClassA 对象。

Class A *ptr2 = obj1; 行之后,我们有三个指针(obj1ptr1ptr2)都指向同一个对象。

如果我们执行delete ptr1;(或等效的delete obj1;delete ptr2;),我们会销毁指向的对象。执行此操作后,任何指向该对象的指针都将变为无效(这回答了您的第一个问题:是的,它会影响ptr2,因为ptr2 之后不会指向有效对象)。

正确的解决方案取决于您要达到的目标:

  • 如果您想要对象的两个副本,假设ClassA 有一个复制构造函数,请执行ClassA *ptr2 = new ClassA(*obj1);。完成后,您需要单独 delete 这个新对象!
  • 如果您想要两个指向同一个对象的指针,请考虑使用类似boost::shared_ptr(google it)的东西

嗯,对于这么简单的 q+a 来说,这已经是一大堆文字了。嗯嗯。

【讨论】:

  • 现在很多人都明白了这个概念。
【解决方案2】:

假设obj2 应该是obj1,那么是的,对ptr1 调用delete 将使ptr2 留下无效数据。解决方案是将ptr1 设置为NULL,如果您想在不丢失ptr2 中指向的对象的情况下清空它。

删除只是在您想完全释放内存时使用。如果您仍然想保留指向的对象和数据,但想清除指针,请将其设置为NULL(或(void *) 0)。

【讨论】:

  • 在 C++ 中,NULL 只是 0(或等效值),而不是指针类型。
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 2015-08-07
  • 2011-05-02
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2010-09-08
相关资源
最近更新 更多