所以,这是一个我正在创建的课程的例子:
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; // ?
}
}
提前致谢!
答案 0 :(得分:7)
这样做的惯用方法是:
class Foo
{
std::unique_ptr<stEx> E;
int index;
public:
Foo() : E(std::make_unique<stEx>()), index(0)
{}
};
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)
在析构函数中,编译器将自动为该类的所有非静态成员插入析构函数。因此,您无需为此添加任何代码。