2013-03-29 2 views
0

과부하 동적 배열 및 운영자는 내 소스를 minimalize : 내 문제를 설명하기 위해 원인 메모리 충돌

#include <iostream> 
class vec{ 
    public: 
    float* X; 
    int DIM; 
    vec(int dimension) 
    { 
     DIM = dimension; 
     X = new float[dimension]; 
     for (int i=0;i<DIM;i++) 
      X[i] = (float) rand()/RAND_MAX; 
    } 
    ~vec(void){ 
     delete [] X; 
    } 

    vec operator-(vec const& rhs) 
    { 
     vec ans(DIM); 
     for (int i=0;i<DIM;i++) 
      ans.X[i] = X[i] - rhs.X[i]; 
     return ans; 
    } 
}; 

int main(){ 
    vec A(5),B(5),C(5); 
    C= A-B; 
    return 0; 
} 

내가 힙이 파괴 된 것으로 오류가이 프로그램을 실행

. 나는 소멸자가 내 문제라고 확신한다. C= A-B;이있는 행에서 변수 ans은 생성자에 의해 삭제되고 반환 될 수 없습니다. 그게 맞습니까? delete [] X; 줄을 지우면 모든 것이 정상입니다. 그러나 그것은 기억을 해방시키지 못할 것이다.

나는이 문제에 대해 가장 유명한 검색 엔진 중 하나를 참고했지만 어떤 대답도 찾지 못했습니다. 어떻게 해결할 수 있습니까?

+0

'ans'이 파괴되는 것은 문제가되지 않습니다. 임시로 'ans'사본이 만들어지고 반환되는 것입니다 (원칙적으로). –

답변

4

C = A-B은 (사용자가 정의하지 않았으므로) 기본 복사 할당 연산자를 호출합니다. 따라서 두 개의 서로 다른 객체가 동일한 동적으로 할당 된 배열을 가리 킵니다.

Rule of Three에서 읽어야합니다. 간단히 말해서 소멸자, 복사 생성자 또는 복사 할당 연산자 중 하나를 정의하는 경우 모두 정의해야합니다.

그러나 바람직하게는 원시 배열을 완전히 사용하지 않는 것이 좋습니다. 자체 메모리를 관리하는 컨테이너 유형을 사용하십시오.

+1

"자체 메모리를 관리하는 컨테이너 유형을 사용하십시오"그게해야 할 일입니다. 기본은'std :: vector'이지만, OP의 경우에는'std :: valarray' 또한 고려할 것입니다. – Angew

+0

해결책 : 공극 연산자 = (VEC CONST 및 우측)에 대한 \t { \t \t INT (I = 0; i가 DIM을 <; 내가 ++) \t \t \t X가 [I] = rhs.X [I]; \t} ?? 아니면 내가해야 할 일이 있니? – wieschoo

+0

고마워요. 제가 보지 못한 것이 었습니다. 이 어리석은 질문에 대해 유감스럽게 생각합니다. – wieschoo

관련 문제