我正在研究一个 Matrix 类,它是用一个 vector 的 vector 实现的,如下所示:
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()
应该完全破坏内部 vector (而不仅仅是内部 vector 的内容),然后是 copy and swap idiom- ish 临时 vector 的效果来释放原始外部 vector 的内存。前者让我觉得我 clear()
每个内部 vector 的内容,但是留下了 n 个空的,仍然在内存中的 vector ,并且必须在每个 vector 上调用临时交换机制一个(因此可能 [未经测试] 影响我的迭代器)。
在外部 vector 上调用 clear()
是否通过调用内部 vector 的析构函数完全释放用于内部 vector 的内存?我不确定他们的析构函数是否以交换习惯用法的方式释放。
最佳答案
注意,这个析构函数比你想象的要棘手。我们开始吧:
好吧,其实不是。你可以感谢rule of zero对于这种灵活的实现。因为 std::vector
是一个行为良好的类(模板),它通过 RAII 正确地管理它的资源。 ,为您的类默认生成的析构函数会做正确的事情™,而无需您键入任何内容。
如果出于任何原因,您仍然需要该析构函数的显式签名,您可以在类中使用以下语法:
~Matrix() = default;
或者,如果你需要定义是越界的,正常声明析构函数,但这样定义它:
Matrix::~Matrix() = default;
关于c++ - 销毁 vector 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48414225/