gpt4 book ai didi

c++ - New 停止我的对象正常工作

转载 作者:太空宇宙 更新时间:2023-11-04 11:52:24 24 4
gpt4 key购买 nike

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

背景:

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

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

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

它在使用 vector 和 map 时崩溃。我继续这一行查询并尝试使用指针和新的:

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_ 的指针会按预期工作。

问题:

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

最佳答案

看起来你有一个很好的构造函数,但是坏的/不足够的(默认)赋值运算符和坏的/不足够的(默认)复制构造函数。

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

//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] 中的对象已损坏。类似的情况发生在您的 map 上。

结论:如果一个对象是从构造函数中产生的,那么你得到的是一个好的对象;如果对象源自复制构造函数,则它已损坏。

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

关于c++ - New 停止我的对象正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17597695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com