这里有两个示例类和类Foo
的析构函数的实现。为什么m_barvec1
在析构函数中是这样实现的?vector<Bar *> m_barvec1
是什么意思?
class Bar {
public:
Bar() : m_arr(new int[100]) {}
~Bar();
int m_x;
std::list<int> m_list;
int* m_arr;
};
class Foo {
public:
Foo() : m_barvec3(new std::vector<Bar>()) {}
~Foo();
Bar m_bar;
std::vector<Bar *> m_barvec1;
std::vector<Bar> m_barvec2;
std::vector<Bar> *m_barvec3;
};
Foo::~Foo() {
for (size_t i = 0; i < m_barvec1.size(); i++) {
delete m_barvec1[i];
}
delete m_barvec3;
}
m_barvec1
是一个std::vector
对象,包含指向Bar
对象的原始指针。Foo
析构函数正在销毁std::vector
所指向的每个Bar
对象。处理此问题的更好方法是对std::vector
的元素类型使用std::unique_ptr<Bar>
或std::shared_ptr<Bar>
而不是Bar*
,让std::unique_ptr
/std::shared_ptr
自动销毁Bar
对象。
CCD_ 17是保持CCD_ 19对象的CCD_。std::vector
的析构函数将处理对Bar
对象的销毁,因此Foo
的析构因子中不需要用户代码来处理此问题。
CCD_ 23是指向保持CCD_ 25对象的CCD_。Foo
析构函数正在销毁指向的std::vector
,这反过来又将销毁它所持有的Bar
对象。处理此问题的更好方法是使用std::unique_ptr<std::vector<Bar>>
而不是std::vector<Bar>*
作为指针,让std::unique_ptr
自动销毁std::vector
。
对m_barvec1
和m_barvec3
使用智能指针可以完全删除Foo
的析构函数。