>我有一个类,它有一个元素,其中包含另一个对象的原始指针,如下所示。请注意,我从实际工作中简化的示例可能有效,但是如果我在这里做,我试图得到概念错误,因为在完全相同的结构和场景中,我得到了分割错误错误。
/*This doesn't have a raw pointer of another object*/
class H1 {
private:
int x, y;
public:
constructors;
copy_constructor;
}
/*This has a h1_ptr element which is a raw pointer of H1*/
class G1 {
private:
int count;
H1* h1_ptr;
public:
G1(int c, H1* lst){
count = 0;
h1_ptr = lst;
}
G1(const G1& g) {
count = g.count;
h1_ptr = g.h1_ptr;
}
G1& operator=(const G1& g)
{
count = g.count;
h1_ptr = g.h1_ptr;
}
}
/*The class that I create unique_ptr from*/
class H3 {
private:
H1 h1, h2;
G1 g1;
public:
H3(H1 _h1, H1 _h2, G1 _g1){
h1 = _h1; h2 = _h2; g1 = _g1;
}
}
我从一个函数中的类H3
创建一个unique_ptr
,并将其返回到另一个函数:
unique_ptr<H3> create_ptr(){
H1 h1(5, 10);
H1 h2(50, 100);
H1* h1_lst = new H1[20];
H1 ls;
for (int i=0;i<20;i++)
{
H1 ls(i, i*2);
h1_lst[i] = ls;
}
G1 g1(200, h1_lst);
unique_ptr<H3> p_h3(new H3(h1, h2, g1));
return p_h3;
}
int main(){
unique_ptr<H3> p_h3 = create_ptr();
H3* h_3 = p_h3.get();//to get the raw pointer
G1 g1(h_3->g1);//corrected
H1* h1_lst = g1.h1_ptr;
for (int i=0;i< 5; i++){
//I just want 5 of them even if there is more
H1 ls = h1_lst[i];
cout << ls.x << ":" << ls.y << endl;
}
return 0;
}
这只会写 1 或 2 行,然后它会因分段错误而崩溃。如果我没有返回唯一指针,而是获取原始指针并将结果写入create_ptr
函数,它将正常工作。
问题出在外部类(在本例中为 G1(的析构函数中,它试图删除原始指针对象。当我删除这些删除过程时,它工作正常,但我相信这仍然是一个坏主意。
不能从另一个唯一指针复制分配std::unique_ptr
。它不是 CopyConstructable 或 CopyAssignable。
但是,您可以使用以下方法转让所有权std::move
:
std::unique_ptr iptr1{new int{1}};
std::unique_ptr iptr2 = std::move(iptr1); // iptr1 now null
如果您希望让指针的多个所有者改用std::shared_ptr
。
在 cpp首选项页面上阅读更多相关信息std::unique_ptr