저는 잠시 동안이 문제를 응시 해 왔지만 왜 실패해야하는지 알지 못합니다. 다음과 같이 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[]
할당 되었기 때문에
빌어 먹을 것과 같아야합니다. 네가 옳아. 감사합니다 –