C ++。类的成员对象的智能指针,其实例本身由智能指针拥有。必要?

时间:2014-04-21 23:22:55

标签: c++ smart-pointers

class Foo
{
public:
    int fooInt;
};

class Bar
{
    Foo fooInBar;
};

int _tmain(int argc, _TCHAR* argv[])
{
    std::unique_ptr<Bar> myBar = std::make_unique<Bar>();
}

我知道myBar可以通过智能指针拥有来防止内存泄漏。

Foo对象fooInBar是否也受到myBar内部性质的保护,或者成员变量fooInBar是否也包含在智能指针中?像这样:

class Bar:
fooInBar(make_unique<Foo>())
{
    std::unique_ptr<Foo> fooInBar;
};

2 个答案:

答案 0 :(得分:3)

从这个角度来看,除非动态分配内存,否则成员对象安全。所以,不,你不需要将它包装在智能指针中。

具体而言fooInBar,作为Bar的子对象,它将被Bar的析构函数自动销毁。 fooInt中的Foo也是如此。

最后,除非你真的需要动态内存,否则你也可以首先避免使用智能指针:

int _tmain(int argc, _TCHAR* argv[])
{
    Bar myBar;
}

答案 1 :(得分:1)

你不必。由于fooInBarBar类型对象内的子对象,因此当作为对象的一部分销毁。智能指针。

但是,如果Bar在堆上单独分配,则应在包含fooInBar对象被销毁之前先释放它。例如。在Bar的析构函数中销毁它。

Bar