2016-09-19 15 views
0

私はそれが未定義の動作だと思う状況に遭遇しました:いくつかのメンバを持つ構造体があり、そのうちの1つがvoidポインタです(私のコードではなく、publicではありません。それをより一般的にする)。 voidポインターに特定のメモリを割り当てても、未定義の動作ですか?

void fooTest(ThatStructure * someStrPtr) { 
    try { 
     someStrPtr->voidPointer = new char[someStrPtr->someVal + someStrPtr->someOtherVal]; 
    } catch (std::bad_alloc$ ba) { 
     std::cerr << ba.what << std::endl; 
    } 
    // ... 

及びいくつかの時点でそれがセグメンテーション障害と割当部(演算子新しい)(それが動作数回、この機能のより多くのコールがあるでクラッシュ:このポインタにいくつかの点でいくつかのチャーメモリを割り当てられ、より多くの場合)。私はこれをデバッグで見たことがあります。

私の知る限りでは、私のマシンはLinuxを使用していますが、セグメンテーションフォールトが最初にあります(私はメモリを割り当てる関数の最初の呼び出しであると思います)。

もっと私は値の印刷追加した場合、:tryブロックの前に

std::cout << someStrPtr->someVal << " " << someStrPtr->someOtherVal << std::endl; 

を、それが最後まで実行されます。このプリントは、構造体ポインタに関する他の問題があるかどうかを調べるために行ってきましたが、値は出力され、0または負ではありません。

私はこれらのトピックを見てきました:topic1topic2topic3と私はいくつかのUBがvoidポインタにリンクしていると思っています。誰もが私はそれを解決することができますので、ここで問題を指すのを助けることができます、ありがとう?

+2

[mcve]を入力してください。 'char *'を 'void *'に割り当てることは、まったく問題ありません。 – Barry

+0

これはマルチスレッドアプリケーションですか? – NathanOliver

+4

'bad_aloc $ ba'ですか? – AnT

答えて

2

ボイドポインタは、C/C++で行うには完全に細かい事であり、あなたは通常、/他のタイプに

からキャストすることができますが、初期化しながら、ワンセグ障害を取得すると、これが使用されるパラメータのいくつかはある意味自分自身が無効ですか:

  • someStrPtrは有効ですか?
  • はsomeStrPtr-> someValであり、someStrPtr-> someotherValは有効ですか?
  • 印刷された値は期待した値ですか?
  • また、マルチスレッドアプリケーションの場合は、他のスレッドがこれらの変数にアクセスしていないことを確認してください(特に、印刷ステートメントと初期化ステートメントの間)。これは本当に難しいものです。
+0

だから問題は何ですか? –

+0

まだ分かっていませんが、 "voidポインタはC/C++で行うには完全に良いことです"という質問に答えています。他の値は有効であるようです。私は 'if(!someStrPtr)std :: cout <<" KO "<< std :: endl;"を追加しました。 – sop

3

いいえ、それ自体は未定義の動作ではありません。一般に、コードが「割当て部分でクラッシュする」とは、割当てられたブロックの一方の端部を書き込んだり、同じブロックを2回以上解放したりすることによって、ヒープを早く壊してしまったからです。つまり、このコードにはバグはありません。

関連する問題