c++ - 销毁 vector 的 vector

标签 c++ vector

我正在研究一个 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/

相关文章:

c++ - 如何跟踪列表的更改

c++类型特征: ensuring a subclass implements a method

c++ - 有没有更好的方法来处理缓冲区和读取中的不完整数据?

c++ - 寻找提供随机访问和 "sequential"访问的数据结构

c++ - 指针作为成员变量

c++ - 带有数组索引(不是迭代器)的 std 给出段错误

c++ - 显示深度优先搜索图遍历 C++

c++ - 如何将现有的 C++ 代码移植到 C++11

C++如何使用默认参数指定模板类的所有 friend ?

c++ - 在堆上初始化 vector of vector