stl:映射问题
stl::map issues
这一定是我做了什么蠢事,但有人见过这种行为吗?
在类成员中定义了一个map,如下所示:
std::map <const std::string, int> m_fCurveMap;
在调试时表现良好,但在发布模式下都出错。map被初始化为一个疯狂的数字:m_fCurveMap [14757395258967641292]()
map之后的任何成员都将完全损坏,例如,如果我在map之后的行中像这样添加一个int:
std::map <const std::string, int> m_fCurveMap;
int m_myIntThing;
和在我的构造函数中设置m_myIntThing为0,在构造函数被调用后m_myIntThing是一个疯狂的数字。如果我把m_myIntThing移动到map上面的行,m_myIntThing的一切都没问题。这最终给我带来了更大的问题。我需要在构造函数中对映射做些什么吗?我现在不在。
我正在使用visual studio,这与gcc一起工作很好。我只看到了释放的问题。项目是一个dll。
如果你以前见过这种疯狂,请帮助它把我逼疯。: -)
很多谢谢,div标记
这种情况在我身上发生过很多次。虽然在您的情况下很难说,但很可能的原因是在不同的项目之间使用了不同版本的C运行时库。检查不同项目的编译器设置中的"代码生成"选项卡,并确保它们是相同的。
实际上发生的是不同版本的C运行时库以不同的方式实现STL容器。然后,当不同的项目试图相互通信时,std::map的含义(例如)发生了变化,并且不再是二进制兼容的。
这种奇怪的行为很可能是某种堆损坏,或者如果它作为参数传递给函数,则是堆栈损坏。
问题是内存损坏。
我在c++项目中经常看到的一个错误是在对象被删除后再使用它。
另一种可能是缓冲区溢出。它可以是同一堆栈上或堆附近的任何对象。
一个很好的方法来抓住罪魁祸首是设置一个调试器断点,触发内存更改。当对象仍然良好时,设置断点。然后等待,直到一些代码写入该内存位置。
如果你从VS调试器中获得信息,我不会相信它告诉你发布DLL的内容。调试器只能被真正信任于Debug dll。
如果程序输出告诉你这个,那么这是不同的——在这种情况下,你没有提供足够的信息。
您是否将发布DLL与调试应用程序混合?
否则听起来像内存损坏,尽管我不能肯定。
- 有什么东西在践踏记忆
- 您正在访问已删除的内存
- 你正在返回一个临时的指针或引用 等
在某些情况下,这些都可以正常工作,因为它们是未定义的行为,只有在发布模式下,它们才会爆炸。
我在g++上遇到了完全相同的问题,我通过删除在此之前的pragma段落中的pragma来解决它。尽管代码是正确的,但我想知道这是否是在某些情况下使用stl::map时平台上出现的编译器错误。
#pragma pack(push,1)
xxxx
#pragma(pop)
给一个内存损坏的具体例子:
typedef std::map<int, int> mymap_t;
static mymap_t static_init() { return mymap_t(); }
class foo {
foo(): mymap(static_init()) {}
//!> d'oh, don't reference!
const mymap_t &mymap;
};
我不小心定义了一个指向成员变量的ref,而不是成员变量本身。它被初始化得很好,但是一旦离开static_init()的作用域,映射就会被销毁,并且ref将在调试中显示为"std::map with 140737305218461 elements"(打印得很漂亮)或类似于它指向现在未分配的内存(或更糟)。
小心意外引用!
- AIX C++映射编译问题
- 在c++中擦除后在映射上迭代时出现的奇怪问题
- 在 C++ 中使用静态映射的奇怪问题
- 一维数组映射方式的性能差异问题
- QlineEdit的信号映射问题
- 使用集合和映射来解决模式问题
- 在将平截头体从摄影机空间转换为灯光空间以进行阴影映射方面存在主要问题
- 使用成员函数指针作为键C++映射时出现问题
- 无序映射的问题
- 我的 lambda 表达式进行映射键比较有什么问题?
- 将 std 绑定传递到函数映射的问题
- 打开文件映射问题,找不到文件映射
- 标准::映射插入/擦除的并发问题
- 删除元素时使用 STL 映射的迭代器时遇到问题
- 在 C 语言中打印映射/过滤器/减少函数时出现问题
- STL 映射和指针出现问题
- 为对象指针映射编写函数模板时出现问题
- boost的问题::内存映射~500MB,外部USB文件
- Netbeans IDE 8.0.2 C++代码辅助问题映射与向量值声明
- STL 中的一些问题映射和列表使用 c++ 使用