C 迭代器/矢量在发行版中不起作用
C++ iterator/vector not working in release build
我正在使用矢量/迭代器在不同类中执行方法,这在调试中以及在我们使用相同方法的其他地方都很好。但是,由于某种原因,当我在版本中运行此代码时,我会收到以下错误:
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
内容。
相关文章:
- 为什么output_editor Concept不需要output_e迭代器标记
- C++不兼容的迭代器类型
- 使用 find() 通过 std::set 的迭代器将不起作用。出了什么问题?
- 使用 std::vector<Particle> 粒子;函数 .at() 不能与迭代器一起使用,它作为 for 循环中的参数
- 我可以在 std::list 中移动元素而不会使迭代器或引用无效,但是如何移动呢?
- 为什么我不能将迭代器应用于接受 const_iterator 引用的函数?
- 与运算符"!="不匹配(c++ 迭代器)
- 如何不擦除迭代器(从"Effective STL")
- 有人能解释一下他们的意思是list.pushback文档(不会使迭代器无效)吗
- 不会使迭代器(和指针)无效的容器
- std::cin >>向量[i]不会让迭代器正常工作吗?
- 调试断言错误 - 列出不兼容的迭代器
- c++:不能给迭代器赋索引
- 我可以(a)不通过输入迭代器写入,或者(b)只通过一个迭代器读取一次吗?
- c++不需要删除迭代器
- C++列出不兼容的迭代器
- std::for_each等效项,它不取消引用迭代器
- 不带循环迭代器的枚举
- std::list擦除不兼容的迭代器
- 深度缓冲区似乎不起作用-OpenGL着色器