尝试深度复制唯一指针时的 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++ 调用内存访问冲突