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