无法通过取消引用unique_ptr制作对象的副本,但具有段错误

时间:2015-07-10 20:28:25

标签: c++ struct segmentation-fault unique-ptr

真的被unique_ptr事物折磨了很多。

所以,我已经定义了类private的{​​{1}}成员函数,如:

C

std::vector<T1> C::mem_fun(std::unique_ptr<T2>& a1, std::vector<T1>& a2, std::vector<T3>& a3) { std::vector<T1> b1; for (struct {std::vector<T1>::iterator it; std::vector<T3>::iterator iu;} gi = {a2.begin(), a3.begin()}; gi.it != a2.end(); ++gi.it, ++gi.iu) { T1 b2; ... if (...) b2.ptr = std::move(gi.it->ptr); else { ... std::unique_ptr<T4> ptr(new T4()); // line 1 *ptr = *(gi.it->ptr); // line 2 -----> which causes a segfault!!!! b2.ptr = std::move(ptr); // line 3 } ... b1.push_back(std::move(b2)); } return b1; } 就像:

T1

为什么该声明会导致段错误? typedef struct T1 { int t1_a; double t1_b; std::unique_ptr<T4> ptr; } T1; 有什么问题吗?还有什么?我从某个地方听到*(gi.it->ptr)可能会有所帮助,但事实并非如此......

我想要为第1-3行做什么基本上是复制get()所指向的对象,并让gi.it->ptr ptr成员指向该副本。不确定是否有任何好的解决方案?感谢。

1 个答案:

答案 0 :(得分:0)

T4是否为您的用例提供了有效的复制构造函数?如果是这样的话:

b2.ptr = new unique_ptr<T4>(new T4(*gi.it->ptr.get()));

会做你想做的事。