首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我尝试删除char*时,调试断言失败

当我尝试删除char*时,调试断言失败
EN

Stack Overflow用户
提问于 2014-01-05 13:26:56
回答 3查看 2.4K关注 0票数 1

我刚开始学习C++和学习虚拟函数,并且知道如果类有虚拟函数而类有指针成员,那么我们必须编写虚拟析构函数。下面是我的代码,我使用的是VirtualStudio2013RC

代码语言:javascript
复制
#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;
}

代码语言:javascript
复制
int main(){
    Parent *a = new Child("Tom");
    delete a;        
    return 0;
}

两者都会给出错误窗口的调试断言失败。

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

非常感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-05 13:29:32

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

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

票数 5
EN

Stack Overflow用户

发布于 2014-01-05 13:34:57

写作时:

代码语言:javascript
复制
Parent *a = new Child("Tom");

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

因此,不能更改文字,因此以任何方式交替字符串文字(如delete)都会导致错误和分段错误,因为这就像更改当前正在运行的可执行文件一样(可执行文件没有此权限)。

票数 1
EN

Stack Overflow用户

发布于 2014-01-05 13:32:07

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

在您的情况下,您正在尝试释放一个const char

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20934079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档