【发布时间】:2015-09-09 21:07:21
【问题描述】:
我有一个名为 Matrix 的类。类中有一个二维数组来保存数据。
template <class Type>
class Matrix{
public:
Matrix(int row, int col){
rows = row; cols = col;
data = new Type*[rows];
for(int i = 0; i < rows; i++){
data[i] = new Type[cols];
}
}
public:
int rows;
int cols;
Type **data;
};
我有一个向量来保存矩阵。每次我有一个矩阵时,我都会将这个向量中的矩阵推回以供将来计算。为了避免内存泄漏,我想在将 Matrix 推回向量后删除它。但是如果我不删除它,程序就可以工作;如果我删除它(如下面的代码所示),当我想对该向量进行一些计算时,程序将显示分段错误。我使用的代码如下所示
vector<Matrix<int>> v;
for(int i = 0; i < 10; ++i){
Matrix<int> a(3,3);
...... // I fill the elements of a.data
v.push_back(a);
for(int j = 0; j < a.rows; ++j)
delete[] a.data[j];
delete[] a.data;
}
希望我已经清楚地解释了我的问题。如果有什么让你感到困惑,请评论我。
谢谢你的帮助!!!
【问题讨论】:
-
对于此类问题,使用valgrind 执行程序可能有助于揭示有关分段错误的详细信息以及其他内存泄漏。
-
当您
push_back时,您创建了一个具有相同指针的副本(指针按值复制)。然后它指向同一个内存,然后您将其删除。您想创建一个为新矩阵分配内存的复制构造函数。 -
What is The Rule of Three? 的邪恶双胞胎。
标签: c++ class pointers matrix vector