2013-03-25 1 views
1

저는 잠시 동안이 문제를 응시 해 왔지만 왜 실패해야하는지 알지 못합니다. 다음과 같이 2D 매트릭스를 구현하는 CMatrix 클래스가 있습니다.2D 배열을 해제 할 때 일치하지 않는 삭제가 발생했습니다.

class CMatrix { 
public: 
    CMatrix(int height, int width); 
    ~CMatrix(); 
    // more stuff here 
private: 
    void deleteData(); 
    void allocData(int height, int width); 

    int rows, cols; 
    double** data; 
}; 

CMatrix::CMatrix(int height, int width) { 
    allocData(height, width); 
} 

CMatrix::~CMatrix() { 
    deleteData(); 
} 

파괴하려고 할 때까지 제대로 작동합니다. 정의 할당 및 할당 취소에 대한 책임 두 가지 방법이 있습니다 다음과 같이

int main(int argc, char** 

    CMatrix a(2, 3); 
    a[0][0] = 1; 
    a[0][1] = 2; 
    a[0][2] = 3; 
    a[1][0] = 4; 
    a[1][1] = 5; 
    a[1][2] = 6; 

    return 0; 
} 

Valgrind의이 말한다 :

void CMatrix::allocData(int height, int width) { 
    this->rows = height; 
    this->cols = width; 

    data = new double*[rows]; 
    for (int i = 0; i < rows; i++) { 
     data[i] = new double[cols]; 
     for (int j = 0; j < cols; j++) 
      data[i][j] = 0; 
    } 
} 

void CMatrix::deleteData() { 
    for (int i = 0; i < rows; i++) { 
     delete data[i]; 
    } 
    delete [] data; 
} 

이 간단한 main 코드는 오작동의 원인이 메시지

==21005== Mismatched free()/delete/delete [] 
==21005== at 0x4C2A44B: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==21005== by 0x402B5C: CMatrix::deleteData() (main.cpp:375) 
==21005== by 0x401731: CMatrix::~CMatrix() (main.cpp:138) 
==21005== by 0x402F5D: main (main.cpp:598) 
==21005== Address 0x5a06090 is 0 bytes inside a block of size 24 alloc'd 
==21005== at 0x4C2AAA4: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==21005== by 0x402A84: CMatrix::allocData(int, int) (main.cpp:366) 
==21005== by 0x4015FB: CMatrix::CMatrix(int, int) (main.cpp:123) 
==21005== by 0x402D63: main (main.cpp:415) 

방법이 deleteData()i=0 일 때 인쇄됩니다. 다른 i 및 delete []에 대해서는 아무 것도 말하지 않습니다.

내가 뭘 잘못하고 있니? 마지막에 [i]가 배열 첨자이며, delete[] 함께 할 수 없다

for (int i = 0; i < rows; i++) { 
    delete[] data[i]; 
} 

하는 것으로 : 그들은 new[] 할당 되었기 때문에

답변

3

당신은 당신의 각 행에 delete[]을 사용해야합니다. 처럼 생각 : 동적으로 할당 된 어레이의 첫 번째 요소의

for (int i = 0; i < rows; i++) { 
    double* p = data[i]; 
    delete[] p; 
} 

p 포인트 이후, 그것은 delete[] ED이어야한다. delete[]delete 문제를 확인 이전의 대답에 추가

+0

빌어 먹을 것과 같아야합니다. 네가 옳아. 감사합니다 –

1

, 당신은 또한 복사 생성자하고 CMatrix 클래스 operator=를 정의 (또는 복사의 의미를 금지하는 그들에게 private 선언) 당신 때문에해야 있습니다 클래스에서 원시 리소스 (즉, 동적으로 할당 된 메모리)를 직접 관리하고 있습니다. 자세한 내용은 Rule of Three을 참조하십시오.

또는 직접 자원 관리자 으로 메모리를 할당하는 대신 std::vector과 같은 직접 리소스 관리자을 사용할 수 있습니다. vector<vector<double>>과 같이 중첩 된 벡터를 정의하여 2D 행렬을 작성할 수도 있습니다. 이렇게하면 std::vector이 자동으로 메모리 할당, 정리 및 복사를 자동으로 수행합니다.

+0

사실 내 코드에서 (+, -, * 등)이 있는데, 관련이 없으므로 질문 길이를 최소화하기 위해 생략했습니다. 그래, 맞아. 이 일은 학교 일의 일부이므로 벡터는이 특별한 경우에 금지되어 있습니다. –

1

각 행에 colums에 할당 된 메모리 블록을 삭제하지 않습니다 삭제 기능은

코드는이

void CMatrix::deleteData() { 
    for (int i = 0; i < rows; i++) { 
     delete[] data[i]; 
    } 
    delete [] data; 
} 
관련 문제