stl:映射问题

stl::map issues

本文关键字:问题 映射 stl      更新时间:2023-10-16

这一定是我做了什么蠢事,但有人见过这种行为吗?

在类成员中定义了一个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"(打印得很漂亮)或类似于它指向现在未分配的内存(或更糟)。

小心意外引用!