gpt4 book ai didi

new引起的C++ bad_alloc?

转载 作者:行者123 更新时间:2023-11-30 04:11:23 25 4
gpt4 key购买 nike

[前注:我已经阅读了 StackOverflow 中的现有线程。我的问题似乎没有]

我正在研究 Quake 2 MD2 格式。在新建一个指针数组后,我似乎得到了错误的分配。但是,如果我做一些可怕的指针操作,一切都很好。我想问题是,为什么我会收到这样的异常?

第一个“MD2Model::Load”有效。我在它得到异常后发布的那个。

基本结构:

struct MD2Header
{
int nIdentifier;
int nVersion;

int nSkinWidth;
int nSkinHeight;
int nFrameSize;

int nNumSkins;
int nNumVertices;
int nNumUV;
int nNumTriangles;
int nNumCmds;
int nNumFrames;

int nOffsetSkins;
int nOffsetUV;
int nOffSetTriangles;
int nOffsetFrames;
int nOffsetCmds;
int nOffsetEnd;
};

struct MD2Skin
{
char szName[64];
};

struct MD2TexCoord
{
short t;
short u;
};

struct MD2Triangle
{
short nVertex[3];
short tu[3];
};

struct MD2Vertex
{
float fVertex[3];
float fNormal[3];
};

struct MD2Frame
{
char szName[16];
MD2Vertex* pVerts;
};

现在,读取 .md2 文件的函数:

bool MD2Model::Load( const char* pszName )
{
FILE* pFile = NULL;

fopen_s( &pFile, pszName, "rb" );
if( !pFile )
return false;

/* Read Header */
fread( &m_Header, sizeof(MD2Header), 1, pFile );

/* Allocate Pointers */
m_pSkins = new MD2Skin[m_Header.nNumSkins];
m_pTexCoords = new MD2TexCoord[m_Header.nNumUV];
m_pTriangles = new MD2Triangle[m_Header.nNumTriangles];
m_pFrames = new MD2Frame[m_Header.nNumFrames];

/* Read Skins */
fseek( pFile, m_Header.nOffsetSkins, SEEK_SET );
fread( m_pSkins, sizeof(MD2Skin), m_Header.nNumSkins, pFile );

/* Read Texture Coords */
fseek( pFile, m_Header.nOffsetUV, SEEK_SET );
fread( m_pTexCoords, sizeof(MD2TexCoord), m_Header.nNumUV, pFile );

/* Read Faces */
fseek( pFile, m_Header.nOffSetTriangles, SEEK_SET );
fread( m_pTriangles, sizeof(MD2Triangle), m_Header.nNumTriangles, pFile );

/* Read Animations */
struct stMD2Vertex
{
unsigned char nVertex[3];
unsigned char nLightNormalIndex;
};
struct stMD2Frame
{
float fScale[3];
float fTranslate[3];
char szName[16];
stMD2Vertex verts[1];
};

unsigned char pBuffer[30000];
stMD2Frame* pTmp = (stMD2Frame*) pBuffer;

fseek( pFile, m_Header.nOffsetFrames, SEEK_SET );
for( int i = 0; i < m_Header.nNumFrames; i++ )
{
fread( pTmp, 1, m_Header.nFrameSize, pFile );

m_pFrames[i].pVerts = new MD2Vertex[m_Header.nNumVertices];
strcpy_s( m_pFrames[i].szName, pTmp->szName );

for( int j = 0; j < m_Header.nNumVertices; j++ )
{
m_pFrames[i].pVerts[j].fVertex[0] = pTmp->verts[j].nVertex[0] *
pTmp->fScale[0] + pTmp->fTranslate[0];

m_pFrames[i].pVerts[j].fVertex[2] = -1 * (pTmp->verts[j].nVertex[1] *
pTmp->fScale[1] + pTmp->fTranslate[1]);

m_pFrames[i].pVerts[j].fVertex[1] = pTmp->verts[j].nVertex[2] *
pTmp->fScale[2] + pTmp->fTranslate[2];
}
}

return true;
}

调试期间转储的变量:

nNumSkins        1          int
nNumVertices 583 int
nNumUV 582 int
nNumTriangles 422 int
nNumFrames 1 int

(我最终删除了我的 D3DXVECTOR3 结构以查看,所以它有点丑..)

好的。因此,在“for”循环内部,它就是爆炸的地方。如果我这样做:

//  unsigned char pBuffer[30000];
// stMD2Frame* pTmp = (stMD2Frame*) pBuffer;

fseek( pFile, m_Header.nOffsetFrames, SEEK_SET );
for( int i = 0; i < m_Header.nNumFrames; i++ )
{
stMD2Frame* pTmp = new stMD2Frame();
fread( pTmp, 1, m_Header.nFrameSize, pFile );

m_pFrames[i].pVerts = new MD2Vertex[m_Header.nNumVertices];
strcpy_s( m_pFrames[0].szName, pTmp->szName );

我在分配“m_pFrames[i].pVerts”语句期间遇到 bad_alloc 异常。有时,我不明白,但是当我尝试新建我的 D3D 类时,我确实得到了异常(我假设无论我之后新建什么,我都会得到它)。我的 MEM 使用率极低,会不会是堆损坏?

实际上,在动画期间创建我的 VertexBuffer 期间我也不得不这样做。

我最终应该使用 vector 吗?我知道他们分配的比需要的多,但这似乎是(最明显的)[最佳]方式。

最佳答案

我会检查行:

strcpy_s( m_pFrames[0].szName, pTmp->szName );

如果从文件中加载的字符串不是以 null 结尾的,那么此拷贝最终可能会覆盖您的堆栈空间并导致损坏。

编辑

再看,我觉得问题是你把stMD2Frame定义为

struct stMD2Frame
{
float fScale[3];
float fTranslate[3];
char szName[16];
stMD2Vertex verts[1];
};

但这只有一个顶点的空间。

当你在框架中阅读时

fread( pTmp, 1, m_Header.nFrameSize, pFile );

你会破坏你的内存。

我建议检查一下

sizeof(stMD2Frame)>=m_Header.nFrameSize 

在读取数据之前。

关于new引起的C++ bad_alloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20251861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com