2012-04-06 2 views
-4

메모리를 할당했지만 소멸자를 호출하면 세그먼트 오류가 발생합니다. 이 코드는 입니다. 기억을 풀기 위해 나는 옳은 것을 사용하고 있습니까?C++ new and delete

class plan { 
    char *symbol; 
    gro *grow; 
    public: 
    plan (int, char[]); //constructor 
    ~plan (); //destructor 
}; 

plan::plan (int num_of_sm, char sm[]){ 
    try { 
    symbol = new char [strlen(sm) + 1]; 
    } 
    catch (std::bad_alloc) { 
    symbol = NULL; 
    } 


    if (symbol != NULL) { 
    if (sm == NULL) { 
     strcpy (symbol, ""); 
    } 
    else { 
     strcpy (symbol, sm); 
    } 
    } 
    gro = new grow [num_of_sm]; 
} 

plan::~plan(){ 
    delete [ ] symbol; 
    delete [ ] gro; 
} 
+4

클래스의 전체 정의가 표시되지 않았기 때문에 말하기가 어렵습니다. http://sscce.org를 읽으십시오. 가장 가능성있는 설명은'symbol'이 유효한 포인터가 아니라는 것입니다. –

+0

생성자는 어떻게 생겼습니까? –

+0

어떻게 그리고 어디에서 심볼을위한 메모리를 할당하고 성장 했습니까? – Haatschii

답변

5

std::string을 사용하십시오.

경우에 따라 분명하지 않은 경우 문제가 해결됩니다.

또한 유사한 문제를 피하고 관련 문제를 좀 더 이해하려면 3의 규칙을 찾거나 5의 규칙 인 C++ 11로 이제 알 수 있습니다.

0

메모리 문제는 프로그램이 항상 즉시 중단되는 것은 아니기 때문에 매우 까다로울 수 있습니다. 예를 들어 동일한 포인터를 두 번 삭제하면 충돌이 발생한 부분을 나중에 삭제할 때까지 프로그램이 계속 잘 수행 될 수 있습니다. Linux에서 실행중인 경우 valgrind를 실행하는 것이 좋습니다 (예 : valgrind myprog arg1 arg2 예 : valgrind를 입력 한 경우).

어떤 경우이든 프로그램이 충돌하는 위치에 문제가 있다고 가정하지 마십시오. 다른 삭제/사용 안 함 문을 검사하여 문제가 있는지 확인하십시오. 또한 num_of_sm은 합리적인 값입니까?

+0

네, 합리적인 가치입니다. 확인을 위해 printf를 사용했으며 숫자는 16에 불과합니다. – user1318393

0

내가 소멸자를 호출하면 세그먼트 오류가 발생합니다.

당신은 그래서, 나는 문제가 두 번 포인터를 삭제 생각한다면

int main() 
{ 
    plan a_plan(2, "hello"); 
    a_plan.~plan(); 
} 

(노호) 테스트 코드를 의미했다. plan :: ~ plan()에서 처음이고 main()을 떠날 때 두 번째. 그래서 plan :: ~ plan()을 호출하지 마십시오.

그리고 Rule of Three (규칙 5), 즉 을 따라야합니다. 소멸자를 정의한 경우 동시에 복사본 생성자와 할당 연산자를 정의해야합니다.