我尝试删除char *时,Debug Assertion失败

时间:2014-01-05 13:26:56

标签: c++ char virtual-destructor

我是C ++新手并学习虚函数,并且知道如果类有虚函数并且类有指针成员,我们必须编写虚析构函数。以下是我的代码,我正在使用Virtual Studio 2013RC

#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;
}

两者都会给出Debug Assertion Failed的错误窗口。enter image description here

对于这种情况,我应该如何正确编写虚拟析构函数?

非常感谢

3 个答案:

答案 0 :(得分:5)

因为您尝试删除文字字符串指针。您将Child::name成员设置为指向文字字符串"Tom",它是指向编译器创建的内存的指针。您应该只delete明确new

另请注意,ParentChild类各自具有不同且不同的name成员变量。初始化Child::name变量时,Parent中的变量仍然未初始化。

答案 1 :(得分:1)

写作时:

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

字符串"Tom"被定义为文字,这意味着它是一个基本单位,如0-9,例如,如果你查看你的可执行文件,你可以在那里找到它,它们是最终的,你可以不以任何方式更改它们(就像您无法将1重新定义为2)。

您无法更改文字,因此以任何方式交替使用字符串文字(如delete)都会导致错误和分段错误,因为它就像更改您当前正在运行的自己的可执行文件(可执行文件没有这个权限)。

答案 2 :(得分:0)

您尝试删除不是复杂对象的char指针。简单的基本规则:对于每个new,必须有delete来释放内存。

在您的情况下,您试图释放const char