包含原始指针的对象的C ++智能指针

时间:2018-08-22 22:58:38

标签: c++ segmentation-fault smart-pointers

我有一个包含一个元素的类,该元素包含另一个对象的原始指针,如下所示。请注意,我从实际工作中简化的示例可能会起作用,但如果在此处进行操作,我会尝试获得概念上的错误,因为在结构和场景完全相同的情况下,我会遇到细分错误。

  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; } 函数中,那么它将很好地工作。

2 个答案:

答案 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

上了解有关此内容的更多信息。