0

他の問題MyMeshコンストラクターにデバッグしました。このコードでは:

if (hollow) {
    numTriangles = n*8;
    triangles=new MyTriangle[numTriangles];
    if (smooth) numSurfacePoints=n*8;
    else numSurfacePoints=n*12;
    surfacePoints=new SurfacePoint[numSurfacePoints];
}else {
    numTriangles = n*4;
    triangles=new MyTriangle[numTriangles];
    if (smooth){
        numSurfacePoints=n*4;
        surfacePoints=new SurfacePoint[numSurfacePoints];
        surfacePoints[n*4]=SurfacePoint(vector3(0,0,1),vector3(0,0,1));
        surfacePoints[n*4+1]=SurfacePoint(vector3(0,0,-1),vector3(0,0,-1));
    }else{
        numSurfacePoints=n*6;
        surfacePoints=new SurfacePoint[numSurfacePoints];
        surfacePoints[n*6]=SurfacePoint(vector3(0,0,1),vector3(0,0,1));
        surfacePoints[n*6+1]=SurfacePoint(vector3(0,0,-1),vector3(0,0,-1));
    }
}

メッシュに必要な SurfacePoints と Triangles を決定しています。ブール値の「中空」と「滑らか」は、コーンに穴が必要かどうか、または法線が同じかどうかを示しますが、それは無関係だと思います。

問題は、hollow==falseの場合、何か問題がありますが、クラッシュはしません。値を配列に入れることもできますが、次のように計算しようとすると:

for(int i=0;i<numSurfacePoints;i++){
    std::cout<<"vertex "<<i<<"-> pos:"<<surfacePoints[i].pos.x<<" "<<
        surfacePoints[i].pos.y<<" "<<surfacePoints[i].pos.z<<
        " norm:"<<surfacePoints[i].norm.x<<" "<<surfacePoints[i].norm.y<<
        " "<<surfacePoints[i].norm.z<<"\n";
}

i=0 のときに、bad_alloc 例外をスローします。

さらに、上部のコード セグメントが演算子 new に bad_alloc をスローしたときがありましたが、その問題は自然に解決しましたが、関連している可能性があります。

誰でも私を助けることができますか?

4

4 に答える 4

2

Nサーフェスポイントにメモリを割り当てているので、N番目とN + 1番目のポイントに値を割り当てるにはどうすればよいですか?

配列境界条件外にチェックを入れてください...

于 2009-11-19T11:41:27.630 に答える
1

割り当てられたメモリの外に書き込んでいます。

    numSurfacePoints=n*4;
    surfacePoints=new SurfacePoint[numSurfacePoints];

使用できる有効なインデックス範囲は [0 ... (n*4 - 1)] です (たとえば、n=10 の場合、インデックス [0..39] を使用できます)。

しかし、あなたは書く

    surfacePoints[n*4]=SurfacePoint(vector3(0,0,1),vector3(0,0,1));
    surfacePoints[n*4+1]=SurfacePoint(vector3(0,0,-1),vector3(0,0,-1));

どちらもそれを超えています (スムーズなケースでも同じことが起こります)。つまり、n==10 の場合、インデックス 40 と 41 に書き込みます。

したがって、ヒープを破損しています(メモリは「新しいもの」の由来です)。メモリ レイアウト (実行ごとに異なる可能性があります) に応じて、他の誰か (ヒープまたはプログラムの別の部分) に属するデータを上書きします。レイアウトによっては、すぐにクラッシュするか、後のクラッシュや問題の原因となります。

あなたの場合、出力を行うと、ランタイム ライブラリも割り当て (malloc または new を呼び出します)、実行中のメモリを取得し、ヒープ システムは何かが間違っていることに気付きます (ヒープ システムが必要とするいくつかのデータを上書きしました)。メモリ チャンクを管理する) を実行し、例外をスローします。

于 2009-11-19T11:54:54.633 に答える
0

ヒープが破損しているようです。割り当てられたポインタを複数回削除していないことを確認してください。配列の範囲外の要素にアクセスしない。削除されたポインタなどにアクセスしない。

于 2009-11-19T11:56:22.650 に答える
0

いくらnですか?ここで、surfacePoints の量が計算されます...

于 2009-11-19T11:28:54.620 に答える