【问题标题】:pointers - duplicate object instance指针 - 重复的对象实例
【发布时间】:2012-12-27 05:57:04
【问题描述】:

如果我有

Class *a1 = new Class();
Class *b1 = a1;

delete b1;
delete a1; //this will give a double free or corruption message;

如果我删除指针b,它和删除指针a一样吗?由于两者都指向同一个 Class 实例。那么,如何将 a1 的实例复制到 b1 中,这样当我删除 b1 时,a1 不会被删除。

Class *a1 = new Class();
Class *b1 = a1;

//how do I duplicate the instance a1 is pointing
//so that when I delete b1, a1 still exists.

delete b1; 
delete a1; //this is still valid 

谢谢。

【问题讨论】:

  • 不确定是否需要所有指针,但Class *b1 = new Class(*a1); 应该这样做。
  • 确保您的复制构造函数正常并从 *a1 创建一个新副本。
  • 这很容易@.@ 谢谢
  • @markuz,是的,如果你在课堂上中使用new,那么如果没有 3/5 规则,那将无法解决问题。看看这些:firstsecond

标签: c++ pointers


【解决方案1】:

您使用指针和分配是否有原因?否则它就像

一样简单
Class a1;
...
Class b1 = a1;

这里不需要删除。

如果你需要保持结构不变,你需要这样做

Class *a1 = new Class();
Class *b1 = new Class(*a1);

Class *a1 = new Class();
Class *b1 = new Class();
*b1 = *a1;

这假设您有一个有效的复制构造函数(例如 #1)或赋值运算符(例如 #2)

p.s:尝试使用 std::unique_ptr 而不是原始指针更安全。

【讨论】:

  • 如果其他人写了 Class 而他们没有添加复制构造函数或赋值运算符怎么办?
  • @corro 默认的拷贝构造函数是浅拷贝(memcpy),但是如果类里面有指针或者其他一些资源就会失败,所以要小心使用。此外,鼓励如果您不打算实现复制/分配,您应该实现一个私有的空副本,以防止任何人使用默认的浅拷贝
猜你喜欢
  • 2011-02-12
  • 2012-04-26
  • 1970-01-01
  • 2013-08-23
  • 2019-10-11
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多