我有一个包含一个元素的类,该元素包含另一个对象的原始指针,如下所示。请注意,我从实际工作中简化的示例可能会起作用,但如果在此处进行操作,我会尝试获得概念上的错误,因为在结构和场景完全相同的情况下,我会遇到细分错误。
element: HTMLElement;
constructor() {}
fakeClick(){
this.element = document.getElementById('ButtonX') as HTMLElement;
this.element.click();
}
我从一个函数中的类 /*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;
}
}
创建一个unique_ptr
并将其返回给另一个函数:
H3
这将只写1或2行,然后由于分段错误而崩溃。如果我没有返回唯一指针,而是获取了原始指针,而是将结果写入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;
}
函数中,那么它将很好地工作。
答案 0 :(得分:0)
问题出在试图删除原始指针对象的外部类的析构函数(如本例中的G1)。当我删除那些删除过程时,它可以正常工作,但是我认为这仍然不是一个好主意。
答案 1 :(得分:-2)
您不能从另一个唯一指针复制分配std::unique_ptr
。它不是CopyConstructible或CopyAssignable。
但是,您可以使用std::move
转让所有权:
std::unique_ptr iptr1{new int{1}};
std::unique_ptr iptr2 = std::move(iptr1); // iptr1 now null
如果您希望拥有多个指针所有者,请改用std::shared_ptr
。
在cppreference页面std::unique_ptr