C++ C++;vector.push_back在添加对象一次时添加两次对象
我正在创建一个DirectX程序,它需要能够动态地将对象添加到列表(或向量)中,以便使用渲染功能。我需要能够通过“[]”操作符访问这些对象,这就是我使用向量而不是列表的原因。问题是,当我使用push_back添加对象时,它会存储该对象两次。例如如果向量为空,并且我正在添加第一个对象,它将把该对象存储到索引0和索引1中。这给我的渲染函数带来了问题,它必须循环遍历每个对象并渲染它们。这将导致每个对象渲染两次 定义位于头文件中的向量(SpriteList2)的代码:C++ C++;vector.push_back在添加对象一次时添加两次对象,c++,vector,push-back,C++,Vector,Push Back,我正在创建一个DirectX程序,它需要能够动态地将对象添加到列表(或向量)中,以便使用渲染功能。我需要能够通过“[]”操作符访问这些对象,这就是我使用向量而不是列表的原因。问题是,当我使用push_back添加对象时,它会存储该对象两次。例如如果向量为空,并且我正在添加第一个对象,它将把该对象存储到索引0和索引1中。这给我的渲染函数带来了问题,它必须循环遍历每个对象并渲染它们。这将导致每个对象渲染两次 定义位于头文件中的向量(SpriteList2)的代码: class Level1 : pu
class Level1 : public Dx11DemoBase// Define Level1 Class
{
public:
vector<Sprite1> SpriteList2;//Define Vector
};
通过cpp文件中的对象循环的代码:
bool Level1::LoadContent()//funtion in the Level1 class
{
Sprite1 Sprite_1({0.0f, 0.0f, 3.0f});//Define Sprite Object
SpriteList2.push_back(Sprite_1);//Add Sprite Object to Vector
Sprite1 Sprite_2({ 100.0f, 00.0f, 2.0f });//Define Sprite Object
SpriteList2.push_back(Sprite_2);//Add Sprite Object to Vector
Sprite1 Sprite_3({ 100.0f, -50.0f, 1.0f });//Define Sprite Object
SpriteList2.push_back(Sprite_3);//Add Sprite Object to Vector
return true;
}
void Level1::Render()//funtion in the Level1 class
{
for (Sprite1 sprite : SpriteList2)//Loop through Vector
{
//Code to use the "sprite" object in rendering functions
worldMat = sprite.GetWorldMatrix();//Retrieve values from each sprite object
}
}
注
添加对象的代码(如上所示)位于单独的cpp文件中,向量在头文件中定义
我尝试了不同的类型(例如:int),结果是一样的。如果向量是在头文件外部定义的,则不会出现此问题,但必须在头文件内部定义向量,以便渲染函数可以访问它。显示的代码中没有任何东西会使对象插入两次,因此归结为一些老式的调试技巧。首先,将loader函数更改为类似以下内容:
bool Level1::LoadContent() {
std::cout << "Enter LoadContent with size " << SpriteList2.size() << '\n';
Sprite1 Sprite_1({0.0f, 0.0f, 3.0f});//Define Sprite Object
SpriteList2.push_back(Sprite_1);//Add Sprite Object to Vector
Sprite1 Sprite_2({ 100.0f, 00.0f, 2.0f });//Define Sprite Object
SpriteList2.push_back(Sprite_2);//Add Sprite Object to Vector
Sprite1 Sprite_3({ 100.0f, -50.0f, 1.0f });//Define Sprite Object
SpriteList2.push_back(Sprite_3);//Add Sprite Object to Vector
std::cout << "Exit LoadContent with size " << SpriteList2.size() << '\n';
return true;
}
更可能的情况是,您会看到一些其他组合,这些组合将显示该代码外部的某些内容导致了问题,例如多次调用函数,或影响函数外部的向量。无法使用此代码重现。请创建一个可以完成这个问题的最小和完整的例子,“问题是当我用PurthJeBead添加一个对象时,它会存储两次”——你是第一个在C++标准库中找到这个bug的人吗?与此形成对比的是,您自己的代码中可能存在一个bug:-)正如其他人所说,您的代码中有一个bug,您没有向我们展示。vector类肯定不会在每次插入时存储每个项目两次,您必须调用
push\u back()
的频率是您认为的两倍。或者你的程序中的某个地方出现了彻底的内存损坏;初始化函数可能在主循环开始之前多次调用它。谢谢
Enter LoadContent with size 0
Exit LoadContent with size 6