2012-04-06 16 views
0

私は動的に新しいオブジェクトを割り当てようとしています。その後、私のデストラクタがそれらをC++のメモリ割り当てnew []とdelete []

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

経由で削除された

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]; 

私は、私は、単純なint型の値を初期化するためのいくつかのコードを編集した場合、それが壊れる、segementation障害を取得しておきます。私の削除[] cmdsが壊れているので、私はそれをコメントアウトする必要があります。どんな助けでも大歓迎です。私は人々が必要ならば、もっと多くのことを明らかにするでしょう。

+2

問題を示す小さな自己コンパイル可能な例を投稿してください。あなたのコードを見ると、改善することがたくさんあります。また、この例もコンパイルされません。これは*オリジナル*コードではありません。 –

+0

私は2日前にこのコードを見たと確信しています.. http://stackoverflow.com/questions/10001614/c-vector-arrays-in-copy-constructors –

+1

@amit:コードは完全に悲惨ですが、 'cmds'がどこにでも宣言されているのを見ることはできません。私はそれが割り当てられているのを見るだけで、メンバーであるかどうかは分かりません。 –

答えて

1

ロボットの名前がNULL(nm == NULL)の場合は、空の文字列を割り当てますが、に割り当てられません。cmdsです。したがって、少なくともブランチでcmdsをNULLに設定するか、デストラクタif (name && *name != 0)delete [] cmds;の前にチェックインする必要があります。あなたは、あなたがnew[]delete[]の使用を避け、代わりにstd::stringstd::vectorを使用する必要がありますしない非常に良い理由がない限り、私は...最初のオプションで

0

に行くと思います。これらはあなたのためのメモリ管理を処理します。そのためにかなり使いやすくなっています。

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

std::string

はずっと、ずっと、 はるかに簡単にフォーマットするメモリ管理、文字列操作、および(std::stringstreamと一緒に)文字列になります。自分でメモリ管理をしたくない、十分にテストされたstd::stringstd::vectorを使用してください。