0

C++/openGL プログラムに問題があります。

これらのようなコードのある時点で(コンストラクターです):

MyObject(MyMesh * m, MyTexture* t, float *c=NULL, float *sr=NULL, int sh=100){
texture=t;
mesh=m;
subObjects=NULL;
texCoords=NULL;
if (texture!=NULL){
        texCoords=new float[mesh->numSurfacePoints*2];

new は std::bad_alloc 例外をスローします。別の場所でも同じです。メモリが不足している可能性はありますか?私はそうは思わないので、あなたが私を助けることができれば、私はうれしいです! さよなら!

4

4 に答える 4

2

メモリが不足した可能性はありますか?

std::bad_allocがスローされたときに、プログラムはどのくらいのメモリを使用していますか?

mesh->numSurfacePointsクラッシュしたときの価値は何ですか?meshポインタが有効なポインタとして渡されたことを絶対に確信していますか?非常に断片化されたアドレス空間がある場合、大きな配列を割り当てるのに十分な連続した空間がない可能性があります。プログラムstd::bad_allocがスローされるまでにどのくらいの時間がかかりますか?

まだ行っていない場合はboost::scoped_array、ヒープに割り当てられたオブジェクトが不要になったときに削除が自動的に行われるように、配列にまたは他の形式のスマートポインターを使用することを検討する必要があります。

于 2009-11-18T15:57:25.280 に答える
2

mesh->numSurfacePointsまた、エラーの原因である可能性がある、多分それは偽物または負の値も確認する必要があります。

于 2009-11-18T15:34:43.690 に答える
1

実際、最近のオペレーティング システムでは、メモリ不足になることはほとんどありません。それを行う前に、マシンは頻繁にスワップし、多かれ少なかれ使用できなくなります。これを見逃すことはできません。また、数年前に Win2k で実験を行ったとき、テスト アプリが可能な限り多くのメモリを割り当てると、ほぼすべてのアプリケーションがクラッシュすることがわかりました。(これには、デバッガー、オフィス アプリケーション、ブラウザー、メール アプリ、さらにはメモ帳が含まれます。)

したがって、不当に大きな量を割り当てようとしているか、ヒープがひどく断片化されて、妥当な要求さえも処理できなくなっていると思います。

このようにコードを書くのはどうですか:

// for example
const std::size_t arbitrary_max_size_constant = std::vector<float>::max_size();
// or std::nummeric_traits<std::size_T>.max() / 10; 

if (texture!=NULL){
  assert(mesh->numSurfacePoints < arbitrary_max_size_constant);
  texCoords = new float[mesh->numSurfacePoints*2];
  // ...
}

これにより、プログラムにバグがある場合にデバッグ モードで警告が表示されますが、リリース コードが遅くなることはありません。別の可能性は、例外をキャッチして、プログラムが割り当てようとしていたメモリを出力することです。

if (texture!=NULL) {
  try {
    texCoords = new float[mesh->numSurfacePoints*2];
  } catch(const std::bad_alloc& x) {
    std::cerr << "failed to allocate << mesh->numSurfacePoints*2 << " bytes!\n";
    throw;
  }
  // ...
}

このようにして、値が不当に大きいかどうかも確認できます。そうである場合は、バグがあります。そうでない場合は、メモリが不足しているか、ヒープが断片化しすぎて、プログラムが必要とする量をこの場所に割り当てることができません。

于 2009-11-18T16:15:54.823 に答える
0

ある時点で texCoords で delete[] を呼び出していますか? 確かにメモリ不足のようです。

于 2009-11-18T15:34:07.617 に答える