C ++迭代器/向量在发布版本中不起作用

时间:2014-02-05 12:27:10

标签: c++ vector iterator release

我使用向量/迭代器来执行不同类中的方法,这在调试和我们使用相同方法的其他地方工作得很好。但是由于某些原因,当我在发布中运行此代码时,我收到以下错误:

FOO.exe中0x011d2928处的未处理异常:0xC0000005:访问冲突。

std::vector<AbstractClass*> vectorClasses;
vectorClasses.push_back(&SomeClass1());
vectorClasses.push_back(&SomeClass2());
vectorClasses.push_back(&SomeClass3());

CString result;     
std::vector<AbstractClass*>::iterator it

for(it = vectorClasses.begin() ; it != vectorClasses.end() ; it++)
{
   result = (*it)->DoSomething(s1, s2);
   if(!IsBlank(result))
   {
       //Do something
       break;
   }
}

为什么会这样?错误与使用vector / iterator有关吗? 是什么让我觉得它与迭代器有关,当我调试它(​​发布)时,visual studio完全跳过我声明我的迭代器的行(这在调试中不会发生)。

当我调试发布版本时,我在尝试执行该行时遇到错误:

result = (*it)->DoSomething(s1, s2);

4 个答案:

答案 0 :(得分:4)

您无法保留临时对象的指针。内存将被重用,因此您的内存访问无效

std::vector<AbstractClass*> vectorClasses;
vectorClasses.push_back(&SomeClass1()); // ill formed, SomeClass1() is create on the stack and destroy after push_back call is done, referencing the pointer after that is invalid as it will not be a SomeClass1 anymore.

由于你需要多态性,你应该这样做,智能指针必须优先于裸指针。

std::vector<std::unique_ptr<AbstractClass>> vectorClasses;
vectorClasses.push_back( std::make_unique<SomeClass1>() );
vectorClasses.push_back( std::make_unique<SomeClass2>() );
vectorClasses.push_back( std::unique_ptr<SomeClass3>( new SomeClass3{} ) ); // if make_unique not available

答案 1 :(得分:1)

您正在使用

添加临时对象的地址
vectorClasses.push_back(&SomeClass1());

问题是该语句后该对象无效。

答案 2 :(得分:0)

而不是:

vectorClasses.push_back(&SomeClass1());

你需要这个:

vectorClasses.push_back(new SomeClass1());

在第一个(错误的)情况下,您正在存储一个临时对象的地址,该对象很快就会被销毁,因此无法使用。在第二个(固定)的情况下,我们存储一个堆分配的对象,它将一直存在,直到你delete它(你应该在你的程序结束时做,但如果你忘了操作系统将清理分配的内存)。

答案 3 :(得分:0)

以下应该解决您的问题, 它不再保留对已删除临时文件的引用:

SomeClass1 someClass1;
SomeClass2 someClass2;
SomeClass3 someClass3;

std::vector<AbstractClass*> vectorClasses;
vectorClasses.push_back(&someClass1);
vectorClasses.push_back(&someClass2);
vectorClasses.push_back(&someClass3);

假设您不删除vectorClasses内容。