构造函数是否unique_ptr初始化原始指针unique_ptr析构函数是否也删除关联的原始指针?

Is unique_ptr constructor initializes the raw pointer and also unique_ptr destructor deletes the associated raw pointer?

本文关键字:ptr 指针 原始 是否 unique 关联 删除 析构函数 初始化 构造函数      更新时间:2023-10-16

我第一次在我的项目中使用智能指针。在使用unique_ptr时,我对unique_ptr和原始指针组合有一些疑问。以及unique_ptr内部的工作方式。

有人可以根据我的理解解释/回答,如下所述,以便我可以继续使用智能指针。

下面是一个示例:

class A 
{ 
public: 
void show() 
{ 
cout<<"A::show()"<<endl; 
} 
}; 
int main() 
{ 
unique_ptr<A> p1 (new A); 
p1 -> show(); 
// returns the memory address of p1 
cout << p1.get(); 
retrun 0;
}

从上面的例子中,

  1. 创建对象"p1"unique_ptr时,我们提供原始指针。在内部,unique_ptr构造函数将使用原始指针初始化unique_ptr。我的理解正确吗?

  2. 根据unique_ptr定义,"指针由一个对象或资源独占"。

    基于上述语句,在我们的场景中,"原始指针"是专用的 由unique_ptr对象"P1"拥有。我说的对吗?

  3. 同样在语句之后,cout <<p1.get((;(在上面的示例程序中(由于它超出了范围,因此在内部调用了unique_ptr的析构函数,并删除了关联的原始指针。我的理解正确吗?

  4. 最后,一旦删除关联的原始指针,unique_ptr对象是否会变为空?

创建对象"p1"unique_ptr时,我们提供原始指针。在内部,unique_ptr构造函数将使用原始指针初始化unique_ptr。我的理解正确吗?

是的。唯一指针将保存相同的地址。

根据unique_ptr定义,"指针由一个对象或资源独占"。

基于上述语句,在我们的场景中,"原始指针"由unique_ptr对象"p1"独占。我说的对吗?

是的。唯一的引用(拥有资源并将释放资源的引用(是唯一指针。但请注意,拥有的不是指针,而是它指向的对象。unique_ptr没有取得原始指针的所有权,而是取得原始指针提供的地址处的对象(资源(的所有权。

同样在语句之后,cout <<p1.get((;(在上面的示例程序中(由于它超出了范围,因此在内部调用了unique_ptr的析构函数,并删除了关联的原始指针。我的理解正确吗?

是的。当唯一 ptr 超出范围时,将导致删除其内部原始指针。

最后,一旦删除关联的原始指针,unique_ptr对象是否会变为空?

不必。由于删除发生在unique_ptr对象本身被销毁时,因此实际上不需要"清空"它。无论如何,它即将消失,所以它的价值是无关紧要的。