0
void Simulator::writeData()
{ 
  resultFile_<<"#"<<*gTime_<<"\n"; 
  Wire* wire=wires_->next;
  char* c=0;
  while(wire!=0)
  {
      if(wire->getType() ==TYPE_OUT)
      {
          c=wire->getValue();
              resultFile_<<"b"<<c<<" "<<wire->getName()<<"\n";  //output result

          //// for vector of results://///
          Tlogic tempEntery(wire->getSize());
          tempEntery.setTime(*gTime_);
          tempEntery.setLogic(c);
          goldenResult_.push_back(tempEntery);
          ////////////////////////////////

      }
   wire=wire->next; 
  } 
} //end of function writeData

このコードでは、一時チャット * 変数が必要です。c という名前を付け、それにメモリを割り当ててから削除します。質問: 私のプログラムはこの関数を正しく呼び出して動作しますが、これを呼び出す 10 回目でプログラムが中断します一時停止すると、このエラーが表示されます:プロセスがデッドロックされているようです。

これはエラーです: プロセスがデッドロックされているようです (または、ユーザー モード コードを実行していません)。すべてのスレッドが停止されました。+OKボタン!

................... それは私のベクター (goldenResult_) のせいだと思います!! その行にコメントすると、デッドロックが発生しないため、このエラーを修正するにはどうすればよいですか?

4

2 に答える 2

0

私の推測は次のとおりです。

   tempEntery.setTime(*gTime_); <--- (hm... gTime ... race somewhere ?? )
   tempEntery.setLogic(c);
   goldenResult_.push_back(tempEntery);

あなたのベクトルを処理する部分を見せてもらえますか?

コメントではなく、ポイントが足りなくてごめんなさい。

于 2012-07-28T12:51:52.160 に答える
0

表示されているコードからは判断できない外部条件に従ってメモリを割り当て/解放しています。私の提案は、割り当てイディオムを修正することです: ポインタを 0 に初期化し、削除後に 0 に設定します:

  char* c = 0; // be sure you don't free if not allocated
  while(wire!=0)
  {
      if(wire->getType() ==TYPE_OUT)
      {
          c=new char[wire->getSize()+1] ;
          wire->getValue(c);
              resultFile_<<"b"<<c<<" "<<wire->getName()<<"\n";  //output result

          //// for vector of results://///
          Tlogic tempEntery(wire->getSize());
          tempEntery.setTime(*gTime_);
          tempEntery.setLogic(c);
          goldenResult_.push_back(tempEntery);
          ////////////////////////////////
         // delete c;
      }
      delete c ; // this can remain unchanged: delete of NULL is harmless
      c = 0;  // this way you avoid to delete more times than allocated
      wire=wire->next; 
  } 

別の方法は、割り当てを追跡するスマートポインターを使用することです。

于 2012-07-28T09:21:47.877 に答える