【问题标题】:c++ vector of vectors destructionc++ 向量的向量破坏
【发布时间】:2011-05-14 10:23:36
【问题描述】:

嗨,我有 vector<vector<int> > matrix; 我通过以下方式初始化它:

inline void resize(const UINT nrows, const UINT ncols, T val) {
vector<T> v_rows(ncols, val);
matrix.resize(nrows, v_rows);
}

现在我担心如果我在旧的地方再次调用 resize ,我必须调用 clear 吗?对于外矩阵?或为每一个清除 matrix.at(i).clear();或者我不需要做任何事情?

【问题讨论】:

    标签: c++ vector memory-management destructor


    【解决方案1】:

    只要 T 管理它自己的资源,您就不必做任何事情。如果没有, clear() 将无济于事。

    【讨论】:

    • T 将主要是数字基本类型,如 int、double、float 可以吗?
    • 是的,在这种情况下,资源管理是自动的,因为它们只是在堆栈上。
    • 标准容器中的任何内容都不会进入堆栈。更多的是一个类型是否管理任何资源以及如何管理的问题(例如,指针不“管理”它们指向的内存)。
    【解决方案2】:

    如果您在任何东西的向量上调用clear(或大小更小的resize),则该向量中所有需要删除的元素都会调用其析构函数并释放它们的内存。

    如果您有一个向量向量,那么每个内部向量的析构函数都会正确清理其资源。当行向量或列向量被销毁时,它会自动清理。

    【讨论】:

    • 有趣的是,维基百科不同意你的一个说法。当您在向量上调用clear 时,它不会改变向量的容量,实际上不会释放内存。 vector::clear - Erases all of the elements. (For most STL implementations this is O(n) time and does not reduce capacity) en.wikipedia.org/wiki/Vector_(C%2B%2B)#Overview_of_functions
    • 实际的“内存管理”应该被std::vector抽象出来。重要的是,在clear 之后,对象被销毁并且内存是,嗯...不是像 “operator delete” 中那样释放,而是像 “它现在可以被释放被向量中的新对象重用或返回到操作系统”,这就是我在这里试图说的——确实不准确。
    • 维基百科是对的,但不清楚。它绝对不会返回给操作系统。我们知道这一点是因为capacity 不会改变(即不允许)
    • 确实调用了析构函数,所以在这种vector&lt;vector&lt;T&gt; &gt;的情况下,大概会释放一些内存(从某种意义上说,被破坏的向量将调用std::allocator::deallocate,这可能或可能不会调用::operator delete,这反过来可能会也可能不会向操作系统释放内存)。
    猜你喜欢
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 2020-07-18
    • 2011-12-13
    • 2014-02-26
    • 1970-01-01
    • 2011-04-21
    • 2011-06-26
    相关资源
    最近更新 更多