char *

2014-01-05 2 views
1

을 삭제하려고 할 때 디버그 어설 션이 실패했습니다. C++을 처음 사용하고 가상 함수를 학습하고 클래스에 가상 함수가 있고 클래스에 포인터 멤버가 있으면 가상 소멸자를 작성해야한다는 것을 알아야합니다. 다음은 내 코드입니다, 나는 모두 디버그 어설의 오류 창 실패를 줄 것이다 가상 스튜디오 2013RCchar *

#include<iostream> 

using namespace std; 
//base and derived class with virtual function 
class Parent{ 
protected: 
    const char *name; 
public: 
    virtual void say(){ cout << "1" << endl; } 
    virtual void showName(){ cout << name << endl; } 
    Parent(){}; 
    Parent(const char *myName) :name(myName){}; 
    virtual ~Parent(){ delete name; cout << "Parent name deleted" << endl; } 
}; 

class Child :public Parent{ 
protected: 
    const char *name; 
public: 
    virtual void say(){ cout << "2" << endl; } 
    virtual void showName(){ cout << name << endl; } 
    Child(){}; 
    Child(const char *myName) :name(myName){}; 
    virtual ~Child(){ delete name; cout << "Child name deleted" << endl;} 
}; 

int main(){ 
    Child a("Tom"); 
    return 0; 
} 

또는

int main(){ 
    Parent *a = new Child("Tom"); 
    delete a;   
    return 0; 
} 

을 사용하고 있습니다. enter image description here

이 경우 가상 소멸자를 올바르게 작성해야합니까?

고마워요.

답변

5

리터럴 문자열 포인터를 삭제하려고했기 때문에. Child::name 구성원을 컴파일러에서 만든 메모리에 대한 포인터 인 리터럴 문자열 "Tom"을 가리 키도록 설정합니다. delete은 명시 적으로 new이어야합니다.

또한 ParentChild 클래스에는 서로 다른 고유 한 name 멤버 변수가 있습니다. Child::name 변수를 초기화 할 때 Parent에있는 변수는 아직 초기화되지 않습니다.

0

복잡한 개체가 아닌 char 포인터를 삭제하려고합니다. 간단한 기본 규칙 : 각 new에 대해 메모리를 확보하려면 delete이 있어야합니다.

귀하의 경우에는 const char을 무료로 보내려고합니다.

1

쓰기 : 문자열 "Tom"가 리터럴로 정의된다

Parent *a = new Child("Tom"); 

, 이것은 당신이 당신의 실행을보고 당신이 실제로 거기를 찾을 수 있다면, 예를 들어, 0-9 같은 기본 단위의 의미, 그들은 마지막이다 어떤 식 으로든 변경할 수는 없습니다 (예 : 1에서 2으로 다시 정의 할 수 없음).

리터럴을 변경할 수 없기 때문에 어떤 식 으로든 (예 : delete) 문자열 리터럴을 번갈아 사용하면 현재 실행중인 사용자 실행 파일을 변경하는 것과 같으므로 오류 및 분할 오류가 발생합니다 (실행 파일에는이 권한이 없음).

+0

감사합니다. @Vladp. 아래 코드를 책에서 읽어들입니다. 'int foo = 10; int * ptr = foo; delete ptr; ' 이것은 작동하지 않는 것 같습니다 ... – cgao