2010-11-28 79 views
2

我正在处理动态数组。函数empty_matrix()创建一个新数组,表示一个矩阵。 delete_matrix()释放为矩阵分配的所有内存。C++中的数组正确分配和释放内存

如果我打电话给add(add(a, b), c),是否会在功能example()中发生内存泄漏?在函数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); 
} 
+1

你可以使用像valgrind这样的工具:http://valgrind.org/它可以告诉你有泄漏。 – Marii 2010-11-28 18:41:32

回答

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

+0

通过使用Object orientation,我无法避免分开释放由'add(...)`函数分配的内存? std :: vector与数组一样快吗?我如何通过get(int i,int j)`来访问数据? – multiholle 2010-11-28 18:59:36

2

是的,您将不得不免费使用delete_matrix任何empty_matrixadd呼叫的结果。你正在泄漏内存,因为你没有释放最内层add呼叫的矩阵。

1

对于一个delete,您应该只有一个new,在您的代码中应该只有一个和一个new[]一个delete[]。这是最重要的原则。

因此,如果功能add创建一个新的矩阵,它需要删除某处。


此外,empty_matrix应该是matrix类的构造函数,并delete_matrix应该是其destuctor。

你也可以更换datastd::vector和你的内存处理将更加自动化,从计数new S和delete S的必要性减轻你。