我有一个问题,我很难搞清楚。这个程序发生的事情有点大,所以我将尝试只提供相关的代码片段,希望它足够了。
这是创建我的场景并导致堆损坏的代码:
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;
断言失败了,从我读到的内容中写出的堆内存就是内置场景。
HEAP CORRUPTION DETECTED:在正常块(#1735)之后的0x000001831FD719A0。 CRT检测到应用程序在堆缓冲区结束后写入内存。 正常位于0x000001831FD719A0的长度为624个字节。
看着堆:
TetraVisu.exe!tetraRender :: Scene 1 624
和
&LT; 0x1831FD719A0&GT; 0x000001831fd719a0 {cam = {lookAt = {value = 0x000001831fd719a0 {{x = 1.00000000 y = 0.000000000 z = 0.000000000 ...},...}} ...} ...} 624
我不知道如何调试它,因为一旦我分配了这个对象,我的堆就会在构造函数启动后立即被破坏。我尝试分配其他对象,它很好。它似乎只发生在Scene和我有成员Camera shadowProjection时。
我知道堆问题很难弄清楚这就是为什么我需要一个比我更了解C ++的人。
编辑:场景和相机对象也来自我制作的静态链接库,我不知道这是否有用。
答案 0 :(得分:0)
好的,所以问题远非为任何人提供正确的信息。这个问题似乎是随机出现的。这似乎是因为用于构建库并用于在最终代码中调用对象的头之间存在差异。我认为这就是堆被破坏的原因,大小可能是以不同的方式计算的。
我不再有这个问题,所以这可能是原因。