-1

新しいオブジェクトを動的に割り当てようとしています。

  int len = (nm == NULL) ? 0 : strlen(nm);

try {
  name = new char[len + 1];
}
catch(std::bad_alloc) {
  name = NULL;
}
if(name) {
    if(nm == NULL)
        strcpy(name, "");
    else
    {
        strcpy(name, nm);
        cmds=new command [num_of_cmds];

次に、私のデストラクタはそれらを経由して削除しています

robot::~robot()
{
if (name) {
    delete[] name;
}
delete [] cmds;
} 

いくつかのコードを編集して単純な int の値を初期化すると、セグメンテーション違反が発生し続けます。私のdelete []コマンドは壊れているので、コメントアウトする必要があります。どんな助けでも大歓迎です。人々が必要とする場合、私はより多くのことを明らかにします。

4

2 に答える 2

1

使用しない十分な理由がない限り、 and の使用は避け、代わりに and を使用new[]してください。これらはメモリ管理を処理します。そのため、かなり使いやすくなっています。delete[]std::stringstd::vector

std::vectorメモリを処理するだけでなく、古い C スタイルの API と互換性があるため、手動で割り当てられたバッファーよりもはるかに便利です。const char *またはを指定する必要がある状況では、( の最初の要素のアドレスなど) を指定char *するだけでかまいません。&vec[0]std::vector

std::stringは、メモリ管理、文字列操作、および (と組み合わせてstd::stringstream) 文字列の書式設定を非常に簡単にします。自分でメモリ管理に取り組もうとしないでください。十分にテストされたstd::stringand を使用してくださいstd::vector

于 2012-04-08T03:11:40.847 に答える
1

ロボットの名前が NULL ( nm == NULL) の場合、空の文字列を割り当てますが、割り当てませcmds。したがって、少なくともそのブランチで cmds を NULL に設定するか、if (name && *name != 0)前にデストラクタをチェックインする必要がありますdelete [] cmds;。私は最初のオプションで行きます...

于 2012-04-06T07:33:38.680 に答える