2013-01-20 4 views
0

이중 포인터를 사용하고 있지만 삭제하려고하면 힙 손상이 발생합니다. 응용 프로그램이 힙 끝 뒤에서 메모리에 쓴 것으로 감지되었습니다. 개체의 소멸자 내부 그것은 "충돌"이중 포인터를 삭제하면 힙이 손상됩니다.

Map::~Map() 
{ 
    for(int i = 0; i < mTilesLength; i++) 
     delete mTiles[i]; 

    delete[] mTiles; 
} 

mTiles는 선언 같은 것을 : 객체 "스프라이트"상속 "타일"의 목적은

Tile **mTiles = NULL; 
mTiles = new Tile *[mTilesLength]; 

for(int i = 0; i < mTilesLength; i++) 
    mTiles[i] = new Tile(...); 

주목할만한 mTiles 경우 3 명의 소멸자 모두 가상 (지도, 타일, 스프라이트)으로 설정되어 있지만 차이가 있는지는 확실하지 않지만 지금까지는 작동하지 않는 것 같습니다.

+6

수업이 3의 규칙을 따르고 있습니까? – chris

+3

문제를 나타내는 최소한의 완벽한 테스트 사례를 구성 할 수 있습니까? 게시 한 코드에는 아무런 문제가 없으므로 문제는 다른 곳에 있습니다. – NPE

+2

FWIW, 표시된 구문이 정확합니다. –

답변

1

게시 한 코드에 문제가없는 것 같습니다. 링크, 나쁜 아무것도 발견했다 - 나는 compiled and ran it <이

struct Tile {int x; Tile():x(7) {}}; 

struct Map { 
    Tile **mTiles; 
    int mTilesLength; 
    Map(int TilesLength_); 
    ~Map(); 
}; 
Map::~Map() 
{ 
    for(int i = 0; i < mTilesLength; i++) { 
    delete mTiles[i]; 
    } 

    delete[] mTiles; 
} 
Map::Map(int TilesLength_): 
    mTiles(), 
    mTilesLength(TilesLength_) 
{ 
    mTiles = new Tile *[mTilesLength]; 

    for(int i = 0; i < mTilesLength; i++) { 
    mTiles[i] = new Tile(); 
    } 
} 
int main() { 
    Map* m = new Map(1000); 
    delete m; 
} 

: 나는 그것에서 포함 된 간단한 자기, 컴파일 (정정) 예를 만들었습니다.

당신이 우리와 공유하지 않은 코드에 문제가 있습니다. 문제를 일으키는 코드를 찾고 올바른 질문을하려면 다음으로 이동하십시오. http://sscce.org/

그런 다음 코드가 간단 할 때까지 코드를 가져 와서 부분을 잘라내어 힙 손상을 여전히 보여줄 때까지 시작하십시오. 관련없는 코드를 제거 할 때마다 각 버전의 복사본을 보관하여 문제가 발생한 부분을 건너 뛰지 마십시오 (이는 개인 프로젝트에서도 버전 제어 시스템이 필요한 여러 이유 중 하나입니다).

+0

+1 VCS 언급 –

관련 문제