2014-04-10 3 views
0

나는 멤버 할당 mBoundingBox는 다음과 같은 구조체 코드에서VS 2010 C++ 충돌은

typedef struct 
{ 
    unsigned int xMin; 
    unsigned int yMin; 
    unsigned int xMax; 
    unsigned int yMax; 
} boundingBox; 

class CImgProc 
{ 
public: 
    CImgProc(void); 
    virtual ~CImgProc(void); 
... 
    boundingBox *mBoundingBox; 
... 
} 

의 구성 멤버 함수와 클래스가 배열 인덱스를 사용하여 포인터를 할당하지 말고 종료하면 다음을 수행합니다.

if (mBoundingBox != NULL) delete [] mBoundingBox; 

오류가 발생했습니다.

입력 사항이 있습니까?

업데이트 됨. 소멸자에서 종료시 오류가 발생합니다. VS에 의해 생성 된 메시지는 다음과 같습니다.

Windows에서 ProcImage.exe에서 중단 점이 트리거되었습니다.

이 될 수 인해 힙의 부패 ... 인해 ProcImage.exe 포커스가있을 F12 가압 사용자

이 또한있을 수있다.

출력 창이 더 많은 진단 정보를 가지고있을 수 있습니다.

포인터를 생성자에서 NULL로 설정하고 필요할 때 할당합니다 (새 것으로). 포인터가 유효하지만 힙 (dbgheap.c의 영역 분리)에있는 것은 아닙니다.

일단 메모리를 할당하면 어떤 포인터 마법도 사용하지 않습니다. 이 경우 이미지를 반복하고 통계를 수집합니다. 그런 다음이 메모리에 저장된 통계를 사용하여 내 이미지로 다시 그려지지만, 다시 한번 말하지만 무언가 다른 방식으로이 메모리를 사용합니다.

새로운 구조체 배열을 만드는 것이 합법적입니까? 아닙니다.

Doh !!! 나중에 시간을 낭비해서 죄송합니다. 나는 안으로 파고 들어가고 나의 창조 및 파괴가 잘다는 것을 발견했다, 그러나 어딘가에 나는 mBoundingBox[X]의 가치를 설정했다. X가 어디에서 밝혀 졌는지는 어쨌든 생성 된 배열의 희미 함입니다. 일반적인 사용자 오류입니다. 버그가 표시되는 놀라운 곳입니다.

+1

문제가 무엇인지 확인하는 데 더 많은 코드가 필요합니다. – DrYap

+0

mBoundingBox * mboundingbox = 새 boundingBox [mBlobCnt]; 이러면 안돼? –

+0

@AliKazmi 아니요 올바르지 않습니다. 'mBoundingBox *'는 포인터 유형이 아닙니다.'boundingBox * '는 유형입니다. 'mBoundingBox'는 멤버 변수의 이름입니다. – CoryKramer

답변

2

아마 대부분 배열을 두 번 삭제하려고합니다. 더 나은 스마트 포인터를 사용

delete[] mBoundingBox; 
mBoundingBox = 0; 

대신

if (mBoundingBox != NULL) delete [] mBoundingBox; 

의 또는 더 나은을 사용하여 관리 할 수 ​​있습니다. 다음의 모든 체크의 첫번째

1

새로운

if (mBoundingBox != NULL) delete [] mBoundingBox; 

수익률은 오히려 예외가 발생,이 메모리를 할당하는 데 실패하면 NULL을하지 않는 잘못된 것입니다.

당신이하고있는 것처럼 진행하고 싶다면 nothrow 버전의 "new"를 사용하십시오. nothrow 버전에서는 new가 예외를 throw하는 대신 NULL을 반환합니다.

mBoundingBox = new (std::nothrow) boundingBox [mBlobCnt];