0

我正在使用 C++ 中的结构编写一个简单的代码,但是在使用 g++ 编译时,我收到了核心转储错误。如果我在下面的 player.name 中使用 cin 输入“Mario”,则不会报错。谁能解释一下出了什么问题?

struct character
{
    char *name;
};

int main()
{
    character player;
    player.name = new char[10];
    player.name = "Mario";
    cout<<player.name<<endl;
    delete player.name;
    return 0;
}

谢谢

4

4 回答 4

8

char*用and替换std::string和删除行,您将不再有问题。newdelete

这段代码失败的原因主要是,当您分配给指针时,它不会将内容复制到指向的事物中——它只是更改了指针指向的事物。

一般来说,总是使用类来拥有资源——在这种情况下,是一个字符串。令人高兴的是,标准为您提供了这样的课程。

于 2012-06-07T19:19:15.090 回答
4

如果您坚持使用 new 等代替字符串,请更改

player.name = "Mario"; 

strcpy(player.name, "Mario");

也改变

delete player.name;

delete[] player.name;
于 2012-06-07T19:21:39.690 回答
4
player.name = new char[10];
player.name = "Mario";

你只是覆盖了指针,它泄露了 10 个字符的缓冲区。你可能是说

player.name = new char[10];
strcpy(player.name, "Mario");

但是使用std::string是一个更好的解决方法,请参阅DeadMG 的答案

正如 Ed 指出的那样,您还错误地删除了缓冲区,您需要delete [].

于 2012-06-07T19:20:12.360 回答
3

看看这两行

player.name = new char[10];
player.name = "Mario";

您将一个数组分配给 player.name,然后立即将指针重置为静态缓冲区。当您调用 delete 时,您正在尝试删除一个静态字符数组,这将是一个段错误。

您需要将数据复制到新分配的内存中,而不是重置指针:

player.name = new char[10];
strcpy(player.name,"Mario");
delete[] player.name;

(请注意,释放指向对象数组的指针,您应该使用delete[]而不仅仅是delete。在这个简单的示例中,没有区别,但是如果数组是带有析构函数的对象,则仅使用析构函数就不会被调用delete.

于 2012-06-07T19:22:58.447 回答