【问题标题】:Is unique_ptr constructor initializes the raw pointer and also unique_ptr destructor deletes the associated raw pointer?unique_ptr 构造函数是否初始化原始指针,并且 unique_ptr 析构函数是否删除关联的原始指针?
【发布时间】:2019-12-13 17:50:15
【问题描述】:

我第一次在我的项目中使用智能指针。在使用 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. 在创建 unique_ptr 对象“p1”时,我们提供了原始指针。在内部,unique_ptr 构造函数将使用原始指针初始化 unique_ptr。我的理解正确吗?

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

    基于上面的陈述,在我们的场景中,“原始指针”是专有的 由 unique_ptr 对象“p1”拥有。我说的对吗?

  3. 在语句之后,cout

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

【问题讨论】:

  • "3.而且在语句之后,cout ,Nitpick ,但我们讨论的是块作用域,而不是变量的最后使用。所以删除发生在return之后。

标签: c++ c++11


【解决方案1】:

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

是的。唯一指针将持有相同的地址。

根据 unique_ptr 定义,“指针由一个对象或资源独占拥有”。

基于上面的陈述,在我们的场景中,“原始指针”由 unique_ptr 对象“p1”独占。我说的对吗?

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

在语句之后,cout

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

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

不必。由于删除是在 unique_ptr 对象本身被销毁时发生的,因此没有真正需要“清空”它。反正它也快不存在了,所以它的价值是无关紧要的。

【讨论】:

  • 您可能想让 OP 更清楚地了解“拥有指针”和“拥有指向的资源”之间的区别。指针不是它们所指向的东西”,并且混淆这是一种搞乱你头脑中所有权的好方法。
猜你喜欢
  • 2019-11-07
  • 2014-10-25
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
相关资源
最近更新 更多