2012-03-16 3 views
1

2 차원 정수 포인터 필드가있는 간단한 행렬 클래스가 있습니다. 다음과 같은 함수를 여러 번 호출하면 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

'value'는 클래스에서 어떻게 정의되어 있습니까? 그리고 왜'i'와'j'로 계산하면 모든 포인터 산술 연산을 할 수 있습니까? 훨씬 단순한 루프를 위해서'rowPtr [i] [j]'를 사용할 수 있습니다. –

+1

클래스에'copy constructor','assignment operator','destructor'를 구현 했습니까? – hochl

+0

정수 ** 값; 행렬 클래스의 데이터 필드 인 2d int 포인터입니다. 포인터로 연습 할 때 포인터에 대한 증분 작업을 선택했습니다. 복사본 생성자 또는 할당 연산자가 없습니다. – tartar

답변

1

클래스의 복사 생성자, 할당 연산자 및 소멸자를 구현 했습니까? 그렇지 않다면 리소스를 관리하고 있으므로 go and implement those입니다.

관련 문제