我正在处理动态数组。函数empty_matrix()
创建一个表示矩阵的新数组。 delete_matrix()
释放为矩阵分配的所有内存。
如果我拨打example()
,我是否会在功能add(add(a, b), c)
中收到内存泄漏?函数add(...)
中分配的内存会发生什么?我必须释放它吗?我应该在哪里做?
matrix empty_matrix(int dim) {
matrix m;
m.dim = dim;
m.data = new int*[dim];
for (int i = 0; i < dim; i++)
m.data[i] = new int[dim];
return m;
}
void delete_matrix(matrix m) {
for (int i = 0; i < dim; i++)
delete [] m.data[i];
delete [] m.data;
}
matrix add(matrix a, matrix b) {
matrix c = empty_matrix(a.dim);
for (int i = 0; i < a.dim; i++)
for (int j = 0; j < a.dim; j++)
c.data[i][j] = a.data[i][j] + b.data[i][j];
return c;
}
void example() {
matrix a = empty_matrix(100);
matrix b = empty_matrix(100);
matrix c = empty_matrix(100);
// some modifications of a, b and c
// ...
matrix d = add(add(a, b), c);
print_matrix(d);
delete_matrix(a);
delete_matrix(b);
delete_matrix(c);
delete_matrix(d);
}
答案 0 :(得分:5)
应该做的是使用面向对象/ RAII。您的矩阵类的数据成员应该是私有的,并且它的内存应该在构造函数中分配,并在析构函数中释放。这样,您就不必担心内存泄漏。
例如......
class matrix
{
public:
typedef int element_type;
matrix(int dimension)
:data_(new element_type[dimension*dimension])
{
}
//Do define your copy-constructor and assignment operators
~matrix()
{
delete [] data_;
}
private:
element_type* data_;
};
这当然,如果这是作业。如果不是,那么在这种情况下你应该避免使用数组。使用std::vector
s
答案 1 :(得分:2)
是的,您必须使用empty_matrix
释放任何add
或delete_matrix
来电的结果。你正在泄露记忆,因为你没有释放最内层add
电话的矩阵。
答案 2 :(得分:1)
您的代码中只有一个new
delete
和new[]
一个delete[]
。这是最重要的原则。
因此,如果函数add
创建了一个新矩阵,则需要在某处删除它。
此外,empty_matrix
应该是matrix
类的构造函数,而delete_matrix
应该是它的destuctor。
您还可以将data
替换为std::vector
,并且您的内存处理将更加自动化,从而使您免于计算new
和delete
s的必要性