C 迭代器/矢量在发行版中不起作用

C++ iterator/vector not working in release build

本文关键字:不起作用 迭代器      更新时间:2023-10-16

我正在使用矢量/迭代器在不同类中执行方法,这在调试中以及在我们使用相同方法的其他地方都很好。但是,由于某种原因,当我在版本中运行此代码时,我会收到以下错误:

foo.exe中的0x011d2928 inthendered例外: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;
   }
}

为什么会发生这种情况?错误与使用向量/迭代器有关吗?让我认为这与迭代器有关的是,当我调试时(发行)视觉工作室完全跳过了我声明迭代器的线路(这不会在调试中发生)。

当我调试发行版构建时,尝试执行该行时会出现错误:

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

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

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

您正在添加

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

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

而不是:

vectorClasses.push_back(&SomeClass1());

您需要此:

vectorClasses.push_back(new SomeClass1());

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

以下应解决您的问题,它不再对已删除的临时性进行任何参考:

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

假设您不删除vectorClasses内容。