1

我不得不完全重写这个问题,因为我现在发现了更多关于它的信息。

背景:

我的程序正在directx11 下绘制一些3d 对象。我有一个类,其中包含绘制所需 3d 对象所需的数据、指针和函数。一切运作良好。我可以创建许多不同的 3d 对象并将它们绘制到任何我想要的地方。伟大的!

然后我需要将它们放入容器和向量中,这样我就不必手动创建每个对象,这就是麻烦开始的地方;它会在 5 次左右崩溃 1 次。

Unhandled exception at 0x00C308C1 in SpritesNTextN3D.exe: 0xC0000005: Access violation reading location 0xFFFFFFFF.

使用矢量和地图时它崩溃了。我继续这行查询并尝试使用指针和新的:

ThreeD_Cube* threed_cube_p;
threed_cube_p = new ThreeD_Cube;

当我运行它的绘图功能时,这也导致它崩溃。

threed_cube_p->draw(threeD, camera, d3dContext_mp);

但是,如果创建为标准对象:

ThreeD_Cube threed_cube_;

绘图功能永远不会崩溃。

threed_cube_-.draw(threeD, camera, d3dContext_mp);

同样,创建指向 threed_cube_ 的指针按预期工作。

问题:

默认构造函数没有的新功能。有什么我应该看的东西来解决这个问题吗?

4

2 回答 2

1

似乎您有一个好的构造函数,但是错误/不足(默认)赋值运算符和错误/不足(默认)复制构造函数。

让我们看看为什么您的代码的某些部分有效但有些无效:

//threed_cube_vec[0].draw(threeD, camera, d3dContext_); // doesnt work!!!

它会告诉您threed_cube_vec[0] 中的内容是坏/损坏的对象。

ThreeD_Cube test  = threed_cube_vec[0]; // But, if I copy it...

在这一行中,(出于某种原因)首先调用了构造函数,这为您提供了一个好的对象。然后调用“=”,部分对象被修改,但对象仍然是好的,因为它在“=”之前已经是好的

ThreeD_Cube* test = &threed_cube_vec[0];

至于指针,它本质上是对象 threed_cube_vec[0] 本身,因此仍然损坏。

ThreeD_Cube test  = threed_cube_vec[0];
vector<ThreeD_Cube> test2;
test2.push_back(test);
test2[0].draw(threeD, camera, d3dContext_);

这并不能解决您所说的问题。“test”是一个很好的对象,但是当你 push_back(test) 进入 test2 时,一个副本被推回 [如果你将它更改为 test2.push_back(std::move(test) ,问题可能就消失了]。因为复制构造函数不完整,test2[0] 中的对象已损坏。类似的情况发生在您的地图上。

结论:如果一个对象来源于构造函数,你得到一个好的对象;如果一个对象源自复制构造函数,则它已损坏。

您可以做一个快速测试:在声明矢量后调整矢量大小,错误应该暂时消失。

于 2013-07-11T20:26:12.820 回答
0

m = XMMatrixIdentity() 后崩溃 - 类中的对齐内存?

本主题涵盖了我的问题的答案。我最终将其追踪到 XMMATRIX 导致由于内存对齐而导致新崩溃。

这是问题的简化版本:

void matrix_test_pointer()
{
    XMMATRIX* xmmatrix_p;
    xmmatrix_p = new XMMATRIX;
    *xmmatrix_p = XMMatrixIdentity(); // this is where it crashes
}

void matrix_test()
{
    XMMATRIX xmmatrix;
    xmmatrix = XMMatrixIdentity();
}

int main()
{
    string wait;

    matrix_test();
    cout << "matrix_test() completed.\n";
    matrix_test_pointer();
    cout << "matrix_test_pointer() completed.\n"; // If it does you are lucky :)

    cin >> wait;
    return 0;
}

matrix_test 可能会完成,但它会在指针完成之前崩溃。

于 2013-07-18T04:36:00.183 回答