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),每个分量都存储在一个浮点变量中。这意味着您需要分别为顶点和法线分配3 倍v_count 和 3 倍 n_count 浮点数。

即修改你的分配为

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

只需尝试重新编写代码以使用 std::vector 而不是原始指针。这将真正帮助您避免堆损坏问题。

于 2012-06-19T11:47:17.323 回答
1

v_count v表示你读到的数字是(unsigned int)'v'。然后你有vertices = new float[v_count];。您可能没有分配足够的存储空间并在数组边界之外写入verticesnormals导致未定义的行为。

于 2012-06-19T11:09:50.163 回答