0

C++ で構造体を使用して簡単なコードを書いていますが、g++ でコンパイルすると、コア ダンプ エラーが発生します。以下の player.name に "Mario" を入力するために cin を使用している場合、エラーは報告されません。誰が何がうまくいかないのか説明してもらえますか?

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*std::stringと で行を削除するnewdelete、問題はなくなります。

このコードは、主に、ポインターに代入するときに、ポインターが指すものに内容をコピーしないため、失敗します。ポインターが指すものを変更するだけです。

一般に、常にクラスを使用してリソース (この場合は文字列) を所有します。幸いなことに、標準ではそのようなクラスが提供されています。

于 2012-06-07T19:19:15.090 に答える
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 に答える
4

string の代わりに new etc を使用することに固執する場合は、変更してください

player.name = "Mario"; 

strcpy(player.name, "Mario");

また変更

delete player.name;

delete[] player.name;
于 2012-06-07T19:21:39.690 に答える
3

2行を見てください

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

配列を player.name に割り当てた後、すぐにポインターを静的バッファーにリセットします。delete を呼び出すと、文字の静的配列を削除しようとしていますが、これはセグメンテーション違反になります。

ポインタをリセットするのではなく、新しく割り当てられたメモリにデータを COPY する必要があります。

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

delete[](オブジェクトの配列へのポインタを解放するには、だけでなく andを使用する必要があることに注意してくださいdelete。この簡単な例では違いはありませんが、配列がデストラクタを持つオブジェクトであった場合、デストラクタは呼び出されません。delete.

于 2012-06-07T19:22:58.447 に答える