New将停止我的对象正常工作

New stops my object working correctly

本文关键字:常工作 工作 对象 我的 New      更新时间:2023-10-16

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

背景:

我的程序是在directx11下绘制一些三维物体。我有一个类,它包含绘制所需三维对象所需的数据、指针和函数。一切都很顺利。我可以创建许多不同的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;

这也导致它在运行draw函数时崩溃。

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

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

ThreeD_Cube threed_cube_;

draw函数从不崩溃。

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

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

问题:

什么是新做的,而默认构造函数不是。有什么可以解决这个问题的吗?

您似乎有一个好的构造函数,但有坏/不充分(默认)的赋值运算符和坏/不适当(默认)复制构造函数。

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

//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"是一个很好的对象,但当您将_back(test)推入test2时,一个副本会被推回[如果您将其更改为test2.push_back(std::move(test),问题可能会消失]。由于复制构造函数不完整,test2[0]中的对象已损坏。类似的情况也会发生在地图上。

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

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

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

这个题目涵盖了我问题的答案。我最终追踪到XMMIX,由于内存对齐,它导致了与new的崩溃。

以下是问题的简化版本:

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很可能会完成,但它会在指针完成之前崩溃。