尝试深度复制唯一指针时的 C++ 内存访问冲突

Posted

技术标签:

【中文标题】尝试深度复制唯一指针时的 C++ 内存访问冲突【英文标题】:C++ memory access violation on trying to deep copy a unique pointer 【发布时间】:2018-10-21 21:59:34 【问题描述】:

所以我有以下课程:

class foo
public:
  unique_ptr<someClass> pt;
Foo()
//Copy constructor
Foo(Foo& f)
  someClass * copy = f.pt.get();
  pt=unique_ptr<someClass>(copy);


;

所以上面的代码按预期工作,复制构造函数将使当前类具有给定类的精确副本。但是,它也给了我内存访问冲突。我尝试在 valgrind 上调试它,但它说它与 unique_ptr 类的默认删除有关。但是,在我的代码中,我没有调用 delete。

我想知道是否有办法消除这些内存访问违规,或者我是否缺少其他步骤。

【问题讨论】:

std::unique_ptr 不可复制,这是有原因的。您创建了一个 hack 来覆盖它,因此问题 delete了同一个指针两次。 【参考方案1】:

对于深拷贝,你必须像这样修改你的拷贝构造函数:

Foo(Foo& f) : pt( new someClass( *f.pt.get() ) ) 

如果尚未定义,您还必须为 someClass 定义一个复制构造函数。

【讨论】:

【参考方案2】:

这不是深拷贝,充其量只是浅拷贝,您将指针从智能指针中取出并放入第二个。

这将失败。您需要先克隆对象。

【讨论】:

以上是关于尝试深度复制唯一指针时的 C++ 内存访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

当引入参数时,从指针调用成员函数的 C++ 调用内存访问冲突

C指针转换导致内存访问冲突

尝试从常量 char * 类型的指针复制数据时出现“超出内存访问”错误。为啥?

什么是分段错误?

访问指向结构的指针会导致内存读取冲突

numpy.i 是不是向 C++ 发送实际指针,或复制内存?