动态分配时类构造函数中的堆损坏

Heap corruption at class constructor when allocated dynamically

本文关键字:损坏 构造函数 动态分配      更新时间:2023-10-16

我有一个问题,我很难弄清楚。这个发生的程序有点大,所以我将尝试只放置相关的代码片段,希望它足够了。

这是创建我的场景并导致堆损坏的代码:

tetraRender::Camera cam(600.0f, 800.0f, 0.75f);
_ASSERT(_CrtCheckMemory());
//CORRUPTION HAPPENS IN THE NEXT LINE
std::shared_ptr<tetraRender::Scene>  scene(new tetraRender::Scene(cam));

在那部分代码之前,我没有完成动态分配。场景的构造函数是这样开始的:

tetraRender::Scene::Scene(Camera cam)
{
_ASSERT(_CrtCheckMemory());
setCamera(cam);
light.intensity = 1.0f;

断言失败,从我读到的内容来看,正在写入的堆内存是构建的场景内存。

检测到堆损坏:在0x000001831FD719A0的正常块 (#1735) 之后。 CRT 检测到应用程序在堆缓冲区结束后写入内存。 位于 0x000001831FD719A0 的正常长度为 624 字节。

并查看堆:

TetraVisu.exe!tetraRender::Scene 1 624

和:

<0x1831FD719A0> 0x000001831fd719a0 {cam={lookAt={value=0x000001831fd719a0 {{x

=1.00000000 y=0.000000000 z=0.0000000000 ...}, ...} } ...} ...} 624

我不知道如何调试它,因为似乎一旦我分配这个对象,我的堆就会在构造函数启动后立即损坏。我尝试分配其他对象,它很好。它似乎只发生在场景和当我有成员相机阴影投影时。

我知道堆问题很难弄清楚,这就是为什么我需要比我更了解C++的人。

编辑:场景和相机对象也来自我制作的静态链接库,我不知道这是否有帮助。

好的,所以这个问题远没有为任何人提供帮助的正确信息。这个问题似乎随机出现和消失。这似乎是因为用于构建库的标头与用于调用最终代码中的对象的标头之间存在差异。我认为这就是堆损坏的原因,大小可能以不同的方式计算。

我不再有这个问题了,所以这可能是原因。