C++中的析构函数应该包含什么



这里有两个示例类和类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_barvec1m_barvec3使用智能指针可以完全删除Foo的析构函数。

相关内容

  • 没有找到相关文章

最新更新