在这种情况下是否有必要使用unique_ptr?

时间:2017-04-05 14:53:02

标签: c++ pointers

所以,这是一个我正在创建的课程的例子:

typedef struct st{
    int counter;
    int fields[128];
}stEx;

class Foo {
    stEx *E;
    int index;
public : 
    Foo(){
        this->index = 0;
        this->E = new stEx;
    }
    ~Foo(){
        delete E;
    }
}

由于我希望E单独作为Foo对象的实例,因此当Foo对象被破坏时,E对象必须自动销毁,并且因此应该比该对象更长。这就是我如何看到智能指针的概念,特别是独特的指针。

但是,我似乎无法理解为什么我需要使用唯一指针。 我如何销毁/释放一个独特的指针?

这是我尝试使用独特的指针。

#include <memory>

typedef struct st{
    int counter;
    int fields[128];
}stEx;

class Foo {
    std::unique_ptr<stEx> E;
    int index;
public : 
    Foo(){
        this->index = 0;
        this->E = std::unique_ptr<stEx>(new stEx());
    }
    ~Foo(){
        E.release; // ?
    }
}

提前致谢!

4 个答案:

答案 0 :(得分:7)

这样做的惯用方法是:

class Foo
{
    std::unique_ptr<stEx> E;
    int index;
public: 
    Foo() : E(std::make_unique<stEx>()), index(0)
    {}
};
  • 使用初始化列表
  • 使用make_unique(从不输入new
  • 没有析构函数

此类型将自动启用移动,但禁用复制

答案 1 :(得分:3)

  

我如何销毁/释放一个独特的指针?

你不是。这就是unique_ptr Foo::E的全部内容与Foo一起被破坏,并且也会破坏它的指针。没有手动清理。

此外,您几乎不必使用release。这个函数使得unique_ptr释放它的指针,因为它赢了摧毁它,你必须像以前一样自己delete

答案 2 :(得分:1)

在这种情况下,我看不出需要使用unique_ptr,因为你只有一个对象,它的生命周期是在课程的生命周期内,所以你可以使用只是一个成员。

typedef struct st{
    int counter;
    int fields[128];
}stEx;

class Foo {
    stEx E;
    int index;
public : 
    Foo(){
        index = 0;
    }
}

此外,您不需要使用此指针来访问班级成员。

没有必要致电:

E.release; // ?

用这一行分配的内存:

this->E = std::unique_ptr<stEx>(new stEx());

当智能指针进入我们的范围时,智能指针句柄的开销就被释放了。

在你的情况下隐含在Foo析构函数中。

注意:unique_ptr::release()释放托管对象的所有权 如果您需要,new stEx对象不再由E拥有。 你必须:

Foo* stExPtr = up.release(); //stEx is no longer owned by unique_ptr
delete stExPtr;

答案 3 :(得分:1)

在析构函数中,编译器将自动为该类的所有非静态成员插入析构函数。因此,您无需为此添加任何代码。