New将停止我的对象正常工作
New stops my object working correctly
我不得不完全重写这个问题,因为我现在已经发现了更多关于它的信息。
背景:
我的程序是在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很可能会完成,但它会在指针完成之前崩溃。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程