2012-03-16 65 views
1

我有一个简单的矩阵类,其中有一个2d的整数指针字段。当我多次调用下面的函数时,它在Linux机器上给我一个glibc错误。当我有“otherM.value ='\ 0';”将此行添加到函数的末尾,问题就解决了。有人可以解释为什么我有这个悬而未决的指针问题,虽然类是通过副本传递,而不是通过引用?指针成员是通过引用传递的?用指针传递类成员

void matrix::sub(matrix otherM) 
{ 
if(dimX!=otherM.dimX || dimY!=otherM.dimY) 
    return; 

int** rowPtr = value; 
int** otherMrowPtr = otherM.value; 

for(int i=0;i<dimX;i++){ 
    for(int j=0;j<dimY;j++){       
     (**rowPtr) = (**rowPtr) - (**otherMrowPtr); 
     (*rowPtr)++; 
     (*otherMrowPtr)++; 
    } 
    (*rowPtr)-=dimY; 
    (*otherMrowPtr)-=dimY; 

    rowPtr++; 
    otherMrowPtr++; 
} 

rowPtr = '\0'; 
otherMrowPtr = '\0'; 

otherM.value = '\0'; 

} 

matrix::matrix(int x, int y){ 

dimX = x; 
dimY = y; 
// allocate here 
value = new int*[dimX]; 
int** rowPtr = value; 
for(int i=0;i<dimX;i++){ 
    *rowPtr = new int[dimY]; 
    rowPtr++; 
} 
} 

matrix::~matrix(){ 
if(value!=NULL){ 
    int** rowPtr = value; 
    for(int i=0;i<dimX;i++){ 
      delete[] (*rowPtr); 
      rowPtr++; 
    } 
    rowPtr-=dimX; 
    delete[] rowPtr; 
    rowPtr = '\0'; 
} 
value = '\0'; 
} 
+0

如何在课堂上定义“价值”?为什么所有的指针算术,如果你用'i'和'j'来计算呢?你可以使用'rowPtr [i] [j]'来获得更简单的循环。 – 2012-03-16 02:19:26

+1

你是否为你的类实现了'copy constructor','assignment operator'和'destructor'? – hochl 2012-03-16 02:20:55

+0

int **值;是2d int指针,它是矩阵类的数据字段。只是为了练习指针,我选择了指针上的增量。我没有复制构造函数或赋值运算符。 – tartar 2012-03-16 02:36:36

回答

1

您是否为您的类实现了复制构造函数,赋值运算符和析构函数?如果不是那么go and implement those,因为您正在管理资源。