2015-01-29 6 views
2

누구든지이 사례를 설명해 주시겠습니까?이 간단한 코드에서 '이중 무료'문제가 발생하는 이유는 무엇입니까? myclass클래스 파괴시 메모리 손상 (double free)

void Rreceive (myclass){} 

int main() { 
    myclass msg (1); 
    Rreceive(msg); 
    return 0; 
} 

: HeaderType

class myclass 
{ 
    private: 
     HeaderType header; 
     byte * text;  

    public: 
     myclass(int ID); 
     ~myclass(); 
     HeaderType getHeader(); 
     byte * getText(); 
}; 

myclass::myclass(int ID){ 
    header.mID = ID; 
    text = (byte *)malloc (10); 
    memset (text, '.', 10); 
} 

myclass::~myclass(){ 
    free (text); 
} 

HeaderType myclass::getHeader(){ 
    return header; 
} 

byte * myclass::getText(){ 
    return text; 
} 

과는 다음과 같습니다

typedef struct { 
    int mID; 
}HeaderType; 

오류 : 당신이 당신의 Rreceive 기능을 입력하면 *** glibc detected *** ./test: double free or corruption (fasttop): 0x0868f008 ***...

+5

3 가지 규칙 : 사용자 정의 복사 생성자, 복사 할당 연산자 또는 소멸자 중 하나가 필요한 경우 대부분 세 가지가 모두 필요합니다. 'myclass'를 값으로 전달합니다. 이는 복사본이 만들어지고 파괴된다는 것을 의미합니다. 암시 적 복사 생성자는 단순히'text' 포인터를 복사하기 때문에 동일한 포인터를 가진 여러 인스턴스를 가질 수 있습니다. 그런 다음 모두는'free'를 시도합니다. –

+0

@IgorTandetnik 사실, 문제에 직면 한 주요 코드 (1000 개가 넘는 행)에 있습니다. 나는이 코드로 코드를 줄 였지만 여전히 같은 오류가있다. – Moi

+0

글쎄, 내가 보여준 코드에서 왜 더블 - 파괴가 일어 났는지 설명했다. 내가 제시하지 않은 코드에 대해 의견을 말할 수는 없다. –

답변

5

당신은 기본 복사 constrcuctor 전화 텍스트 p의 사본을 만들지는 않을 것입니다. ointer (다른 말로하면, 그는 포인터를 새로운 복사본에 할당 할 것이다).

Rreceive 범위를 종료 할 때 동일한 메모리 주소를 가리키는 복사 된 인스턴스에서 자유 (텍스트)합니다.

주 기능 범위를 종료 할 때 동일한 메모리 주소를 다시 해제하려고 시도합니다.

+0

감사합니다. @MichaelCMS – Moi