0

次のクラスを宣言しました。

class StaticMesh
{
public:
    unsigned int v_count;
    float* vertices;
    unsigned int n_count;
    float* normals;

    void Load_lin(const char* file);
    void Draw(void);
    void Release(void);
};

このクラス(名前が示すように)は、.linファイルをロードできる静的メッシュを表します。

.linファイルは、C#を使用して作成した別のアプリケーションによって生成されます。このアプリケーションは、.objファイルを読み取り、次の構造を持つ.linファイルを生成します。

v_count v
n_count n
a#a#a
b#b#b
a#a#a
b#b#b

ここで、vは頂点の数、nは法線の数、a/bは座標を表します。

Load_lin(const char *)は、これらのファイルをロードする関数であり、次のとおりです。

void StaticMesh::Load_lin(const char* file)
{
    std::ifstream in (file);

    if (!in)
    {
        std::cout << "Error: Failed to load staticmesh from '" << file << "'." << std::endl;
        return;
    }

    char buffer[256];

    in.getline(buffer, 256);
    sscanf_s(buffer, "v_count %i", &v_count);
    in.getline(buffer, 256);
    sscanf_s(buffer, "n_count %i", &n_count);

    vertices = new float[v_count];
    normals = new float[n_count];

    unsigned int a = 0;
    unsigned int p = 0;
    float x, y, z;

    do
    {
        in.getline(buffer, 256);
        if (buffer[0] == '\n' || buffer[0] == '\r') break;

        sscanf_s(buffer, "%f#%f#%f", &x, &y, &z);
        vertices[a++] = x;
        vertices[a++] = z;
        vertices[a++] = y;

        in.getline(buffer, 256);

        sscanf_s(buffer, "%f#%f#%f", &x, &y, &z);
        normals[p++] = x;
        normals[p++] = z;
        normals[p++] = y;

    } while (!in.eof());
    in.close();
}

エラーの原因をこの関数に絞り込みましたが、エラーはアプリケーションを閉じたときにのみ表示され、発生しない場合もあります。

したがって、エラーが発生する行は、実際にはWinMainの終わりです。

return msn.message;

さらに進んで、std :: coutを使用して変数「a」と「p」を出力しました。これによりヒープ破損エラーが発生しますが、今回はmalloc.cの55行目です。

__forceinline void * __cdecl _heap_alloc (size_t size)
{

    if (_crtheap == 0) {
        _FF_MSGBANNER();    /* write run-time error banner */
        _NMSG_WRITE(_RT_CRT_NOTINIT);  /* write message */
        __crtExitProcess(255);  /* normally _exit(255) */
    }

    return HeapAlloc(_crtheap, 0, size ? size : 1);
} // LINE 55

私はこの最後のエラーを無駄に検索しました。

お時間をいただきありがとうございます。:)

4

3 に答える 3

2

v_countとn_countは頂点の数に言及していると思います。コードによると、各頂点には3つのコンポーネント(x / y / z)があり、各コンポーネントはfloat変数に格納されます。これは、頂点と法線にそれぞれ3倍のv_countと3倍のn_count数のfloatを割り当てる必要があることを意味します。

つまり、割り当てを次のように変更します

vertices = new float[v_count * 3];
normals = new float[n_count * 3];
于 2012-06-19T12:26:31.577 に答える
1

v_count v読んだ数字が。であることを意味します(unsigned int)'v'。そして、あなたは持っていvertices = new float[v_count];ます。十分なストレージを割り当てず、アレイの境界外に書き込んで、未定義の動作が発生する可能性がありverticesますnormals

于 2012-06-19T11:09:50.163 に答える
1

生のポインタの代わりにstd::vectorを使用するようにコードを書き直してみてください。これは、ヒープの破損に関する問題を回避するのに本当に役立ちます。

于 2012-06-19T11:47:17.323 に答える