我正在研究通过向量向量实现的Matrix类,如下所示:
class Matrix {
private:
int r, c;
std::vector<std::vector<double> > grid;
public:
//things
Run Code Online (Sandbox Code Playgroud)
目前,我正在实现析构函数,并对此有所考虑。在我(聪明地)切换到之前,std::vector我使用double ** grid。new因为每个指针都指向一个数组(这也是我相信的指针...或者我遇到的错误提示了...),所以这意味着要进行大量调用。无论如何,析构函数看起来像:
Matrix::~Matrix() {
for (int i = 0; i < r; i++) {
delete [] grid[i]
delete [] grid
Run Code Online (Sandbox Code Playgroud)
现在,我正在尝试复制该文件(可能不必要?),并具有以下内容:
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);
Run Code Online (Sandbox Code Playgroud)
和
Matrix::~Matrix() {
this->grid.clear();
std::vector<std::vector<double> >().swap(this->grid);
Run Code Online (Sandbox Code Playgroud)
我倾向于使用后者,因为它clear()应该完全破坏内部向量(而不仅仅是内部向量的内容),然后破坏临时向量的复制和交换成语作用以释放原始外部向量的内存。前者让我认为我clear()每个内部向量的内容,但是留下了n个空向量,仍在内存中,因此必须调用每个内部向量的临时交换机制(因此可能[未测试]影响我的迭代器)。
调用clear()外部向量是否会通过调用其析构函数来完全释放用于内部向量的内存?我不确定他们的析构函数是否以交换惯用法进行分配。
请注意,此析构函数比您想象的要棘手。开始了:
?
Run Code Online (Sandbox Code Playgroud)
好的,实际上不是。您可以感谢零规则的这种灵活实施。由于std::vector是一个行为正常的类(模板),可以通过RAII正确地管理其资源,因此该类的默认生成的析构函数可以执行正确的事情,而无需您键入任何内容。
如果出于某种原因仍然需要该析构函数的显式签名,则可以在类中使用以下语法:
~Matrix() = default;
Run Code Online (Sandbox Code Playgroud)
或者,如果您需要使定义超出范围,请正常声明析构函数,然后这样定义它:
Matrix::~Matrix() = default;
Run Code Online (Sandbox Code Playgroud)