我声明了以下类:
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
我搜索了最后一个错误但没有用。
感谢您的时间。 :)
答案 0 :(得分:2)
我认为v_count和n_count提到顶点的数字。根据代码,每个顶点将有3个组件(x / y / z),每个组件存储在float变量中。这意味着您需要分别为顶点和法线分配 3次 v_count和3次n_count浮点数。
即将您的分配修改为
vertices = new float[v_count * 3];
normals = new float[n_count * 3];
答案 1 :(得分:1)
v_count v
表示您阅读的数字为(unsigned int)'v'
。然后你有vertices = new float[v_count];
。您可能没有分配足够的存储空间并在数组vertices
和normals
的范围之外写入,从而导致未定义的行为。
答案 2 :(得分:0)
尝试重新编写代码以使用std :: vector而不是原始指针。这将真正帮助您避免堆损坏问题。