我正在处理一个矩阵类,它是用向量实现的,如下所示:
class Matrix {
private:
int r, c;
std::vector<std::vector<double> > grid;
public:
//things目前我正在实现析构函数,并对其进行了考虑。在我(聪明地)切换到std::vector之前,我使用的是double ** grid。这意味着有一些new调用,因为每个指针都指向一个数组(这也是我遇到的believe...or错误提示的指针.)。无论如何,析构函数看起来是这样的:
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()应该完全销毁内部向量(不仅仅是内部向量的内容),然后是临时向量的复制和交换习语效应,以释放原始外部向量的内存。前者使我认为我clear()每个内部向量的内容,但留下n个空的、仍在内存中的向量,并不得不调用每个向量的临时交换机制(因此可能会对迭代器产生影响)。
调用外部向量上的clear()是否通过调用其析构函数完全释放用于内部向量的内存?我不确定他们的析构函数是否以交换成语那样的方式释放。
发布于 2018-01-26 10:27:14
注意,这个破坏者比你想象的要复杂。我们开始:
好吧,实际上,不是。您可以感谢零规则提供了这个灵活的实现。由于std::vector是一个行为良好的类(模板),它通过雷伊正确地管理其资源,因此您的类的默认生成析构函数可以在不键入任何内容的情况下执行正确的™操作。
如果出于任何原因,仍然需要该析构函数的显式签名,则可以在类中使用以下语法:
~Matrix() = default;或者,如果您需要定义偏离线,通常声明析构函数,但定义它:
Matrix::~Matrix() = default;发布于 2018-01-24 03:53:49
您不需要编写显式析构函数。当你超出这个2D向量定义的范围时,默认的析构函数序列将处理销毁部分。二维向量中的每个元素都是一维向量,一维向量中的每个元素都是double,因此默认的破坏序列将首先破坏网格,然后再破坏存储在网格中的每个double元素,然后再对grid1等进行重复。
_____
_____ grid[0] of doubles |_|_|_|....
|_____ grid[1] of double
grid--> |_____ grid[2] of double
|_____ grid[3] of double
|_____ grid[4] of doublehttps://stackoverflow.com/questions/48414225
复制相似问题