C++ “新建”将停止我的对象正常工作

C++ “新建”将停止我的对象正常工作,c++,directx,new-operator,xna-math-library,C++,Directx,New Operator,Xna Math Library,我已经完全重写了这个问题,因为我现在发现了更多关于它的东西 背景: 我的程序正在directx11下绘制一些3d对象。我有一个类,它包含绘制所需3d对象所需的数据、指针和函数。一切都很顺利。我可以创建许多不同的3d对象,并在任何我想要的地方绘制它们。太好了 然后我需要把它们放在一个容器中,放到一个向量中,这样我就不必手动创建每个对象,这就是问题的根源;大约五分钟内它会崩溃一次 Unhandled exception at 0x00C308C1 in SpritesNTextN3D.exe: 0x

我已经完全重写了这个问题,因为我现在发现了更多关于它的东西

背景:

我的程序正在directx11下绘制一些3d对象。我有一个类,它包含绘制所需3d对象所需的数据、指针和函数。一切都很顺利。我可以创建许多不同的3d对象,并在任何我想要的地方绘制它们。太好了

然后我需要把它们放在一个容器中,放到一个向量中,这样我就不必手动创建每个对象,这就是问题的根源;大约五分钟内它会崩溃一次

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_vec[0].draw(threeD, camera, d3dContext_); // doesnt work!!!
它告诉您三维立方体中的内容[0]是一个坏/损坏的对象

ThreeD_Cube test  = threed_cube_vec[0]; // But, if I copy it...
在这一行中,(出于某种原因)首先调用构造函数,这将为您提供一个好的对象。然后调用“=”,部分修改对象,但对象仍然良好,因为它在“=”之前已经良好

至于指针,它本质上是三维立方体向量[0]本身的对象,因此仍然损坏

ThreeD_Cube test  = threed_cube_vec[0];
vector<ThreeD_Cube> test2;
test2.push_back(test);
test2[0].draw(threeD, camera, d3dContext_);
ThreeD_Cube test=ThreeD_Cube_vec[0];
向量测试2;
测试2.推回(测试);
test2[0]。绘制(三维,摄像头,d3dContext_389;);
这并没有像你说的那样解决问题。“test”是一个很好的对象,但是当您将_向后推(test)到test2时,一个副本会被向后推[如果您将其更改为test2.push_向后推(std::move(test),问题可能会消失]。由于副本构造函数不完整,test2[0]中的对象已损坏。类似的情况也会发生在您的映射中

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

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

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

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

让我们看看为什么代码的某些部分可以工作,但有些部分不能:

//threed_cube_vec[0].draw(threeD, camera, d3dContext_); // doesnt work!!!
它告诉您三维立方体中的内容[0]是一个坏/损坏的对象

ThreeD_Cube test  = threed_cube_vec[0]; // But, if I copy it...
在这一行中,(出于某种原因)首先调用构造函数,这将为您提供一个好的对象。然后调用“=”,部分修改了对象,但该对象仍然是好的,因为它在“=”之前就已经是好的了

至于指针,它本质上是三维立方体向量[0]本身的对象,因此仍然损坏

ThreeD_Cube test  = threed_cube_vec[0];
vector<ThreeD_Cube> test2;
test2.push_back(test);
test2[0].draw(threeD, camera, d3dContext_);
ThreeD_Cube test=ThreeD_Cube_vec[0];
向量测试2;
测试2.推回(测试);
test2[0]。绘制(三维,摄像头,d3dContext_389;);
这并没有像您所说的那样解决问题。“test”是一个很好的对象,但是当您将_向后推(test)到test2中时,一个副本会被向后推[如果您将其更改为test2。push_向后推(std::move(test),问题可能会消失]。由于复制构造函数不完整,test2[0]中的对象会损坏。类似的情况也会发生在您的映射中

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

ThreeD_Cube test  = threed_cube_vec[0];
vector<ThreeD_Cube> test2;
test2.push_back(test);
test2[0].draw(threeD, camera, d3dContext_);
您可以做的一个快速测试:在声明向量后调整其大小,错误应该暂时消失。

本主题涵盖了我问题的答案。我最终将其追溯到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;
}
void矩阵\u测试\u指针()
{
XMMATRIX*XMMATRIX\u p;
xmmatrix_p=新的xmmatrix;
*xmmatrix_p=XMMatrixIdentity();//这就是它崩溃的地方
}
空隙矩阵_试验()
{
XMMATRIX-XMMATRIX;
xmmatrix=XMMatrixIdentity();
}
int main()
{
字符串等待;
矩阵_检验();
迫不及待;
返回0;
}
矩阵测试很可能会完成,但它会在指针完成之前崩溃。

本主题涵盖了我问题的答案。我最终将其追溯到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;
}
void矩阵\u测试\u指针()
{
XMMATRIX*XMMATRIX\u p;
xmmatrix_p=新的xmmatrix;
*xmmatrix_p=XMMatrixIdentity();//这就是它崩溃的地方
}
空隙矩阵_试验()
{
XMMATRIX-XMMATRIX;
xmmatrix=XMMatrixIdentity();
}
int main()
{
字符串等待;
矩阵_检验();
迫不及待;
返回0;
}

矩阵测试很有可能会完成,但它会在指针完成之前崩溃。

三维立方体向量在哪里?您得到的错误似乎表明它是空的,并且使用
操作符[](size\t)
不会为您检查它,不像
.at(size\t)
你的意思是向量有什么东西吗?是的,它肯定有,因为我可以把它复制到一个新对象上。我只是把它放在一个I=3d\u cube\u vec.size()中循环,结果是一样的。我希望我没有误解你的评论。我想大胆猜测一下,这不是
向量
实现,而是你代码中的某个东西,很可能是
三维立方体
的实现,这就是罪魁祸首。你遵守了吗?我同意@Praetorian的观点。有些东西是错误的一路上被吃掉,它可能是
ThreeD_Cube
成员的一个浅薄副本。现在是SSCE时间!Three_Cube_vec在哪里?你得到的错误似乎表明了这一点