【发布时间】:2018-07-03 00:15:55
【问题描述】:
我正在研究一个 Matrix 类,该类是用一个向量实现的,如下所示:
class Matrix {
private:
int r, c;
std::vector<std::vector<double> > grid;
public:
//things
目前我正在实现析构函数,并对此进行了思考。在我(聪明地)切换到std::vector 之前,我使用的是double ** grid。这意味着相当多的new 调用,因为每个指针都指向一个数组(这也是我相信的指针......或者我遇到的错误无论如何都暗示......)。无论如何,析构函数看起来像:
Matrix::~Matrix() {
for (int i = 0; i < r; i++) {
delete [] grid[i]
delete [] grid
现在我正在尝试复制它(也许是不必要的?)并拥有以下内容:
Matrix::~Matrix() {
std::vector<std::vector<double> >::iterator it = this->grid.begin();
for (it; it != this->grid.end(); it++) {
(*it).clear()
this->grid.clear();
std::vector<std::vector<double> >().swap(this->grid);
和
Matrix::~Matrix() {
this->grid.clear();
std::vector<std::vector<double> >().swap(this->grid);
我倾向于使用后者,因为clear() 应该完全破坏内部向量(不仅仅是内部向量的内容),然后 复制和交换 idiom-ish 效果临时向量以释放原始外部向量的内存。前者让我认为我 clear() 每个内部向量的内容,但留下了 n 个空的、仍在内存中的向量,并且必须在每个向量上调用临时交换机制(因此可能 [未经测试] 影响我的迭代器)。
在外部向量上调用clear() 是否通过调用它们的析构函数来完全释放用于内部向量的内存?我不确定他们的析构函数是否以交换习语的方式释放。
【问题讨论】:
-
不用了,所有的vector都有自己的析构函数。
-
不需要你写析构函数。
-
向量会自我毁灭。无事可做。
-
big 3 背后的指导方针是,如果您需要定义一个(复制 ctor、复制分配或析构函数),您可能需要另外 2 个,而不是您应该始终定义所有三个。跨度>
-
并添加到@BenjaminLindley:现在您的所有成员都是自我清洁的(因此您没有手动管理的资源),您可能不需要 任何 大3;不定义它们,编译器将为您正确生成所有它们(在 C++11 及更高版本下,移动构造函数和移动赋值运算符也是如此),您无需付出任何努力。比这里的 3 规则更重要的是 the rule of 0。