2011-07-05 6 views
1

2次元配列を動的に割り当てようとしていて、使用後に削除しようとしています。コードは次のようになります。削除時のアクセス違反メッセージ動的に作成された2次元配列

func(char* pszError) 
{ 

    //Initialize 

    char ** ptr = new char*[1]; 

    // Some copying stuff in ptr[0] 
    ptr[0] = new char[strlen(psError) + 1]; 
    strcpy(ptr[0], strlen(pszError) + 1, pszError); 

    delete[] ptr[0]; 

    delete[] ptr; 

    return; 

} 

これは私には無害で、エラーが発生してはいけません。しかし、ポイントdelete[] ptr;で私はアクセス違反を投げる。

誰でも助けてくれますか?私はこれで十分な頭を叩いた。

+2

エラーは、 "いくつかのコピーのもの" です。おそらく、割り当てられたスペースの外側に書き込みます。 –

+2

'std :: vector'またはBoost.MultiArrayを使用してください。 –

+1

このコードの部分は正しいです。 「ptr [0]の一部をコピーしています」で何が起こっていますか?多分、あなたは(a)ptr [0] [b]の値を明示的に変更していて、誤ってptr [0] []の境界を越えてptr [0]の値を暗黙的に変更しているかもしれません。 (これらの2つの配列は、ヒープ上にお互いに「座っている」可能性が高いでしょう)。 – CygnusX1

答えて

1

エラーがこれらの行である:他に

ptr[0] = new char[strlen(psError) + 1]; 
strcpy(ptr[0], strlen(pszError) + 1, pszError); 

すべてが私に正しく見えます。しかし、コードはこれらのエラーでコンパイルすべきではありません。考慮すべきいくつかの点:

  • strcpyは3つのパラメータを取らない。このコードはコンパイルすべきではありません。これは、次のいずれかを意味する可能性があります。
    • あなたは誤字があり、strncpyを使用することを意味します。この場合、2番目と3番目のパラメータが逆方向になり、アクセス違反が発生します。
    • 3つのパラメータを受け入れる独自の関数でstrcpy関数をオーバーロードしました。このような場合は、コードを投稿してください。あなたがstrncpyを使うのはおそらく良いでしょう。
  • "strlen(psError)"はコンパイルしないでください( "z"がありません)。私はあなたがpszErrorを意味すると仮定しますが、psErrorという名前のグローバル変数があると、間違った量のメモリが割り当てられている可能性があります。
  • pszErrorが悪いポインタであるか、おそらくヌル終了ではない場合、コードは明らかにクラッシュします。

適切なstrcpy & strncpyのパラメータについては、http://linux.die.net/man/3/strcpyを参照してください。

0

助けてくれてありがとう!私たちは、この問題があなたの中のある人によって指摘されたものであることを発見しました。したがって、返されたポインタが適切だった場合は、割り当て後にチェックする必要があります。私たちがコピーをしている間、それは決してcompalinedされなかった/ etc。しかし、ディストラクタがメモリを解放しようとすると、アクセス違反が発生しました。

よろしく、

アンディ

関連する問題