当我在一个编译单元中声明一个类型的成员变量std::map
而不在另一个编译单元中时,当包含对象被破坏时,我会遇到分段错误。当我对 做同样的事情时std::vector
,它工作得很好。
在我的情况下,这绝对是一个错误,我修复了它,但我仍然想知道是什么导致了崩溃。
这是代码:
foo.hpp:
#ifdef DECLARE_MAP
#include <map>
#endif
#ifdef DECLARE_VECTOR
#include <vector>
#endif
#include <string>
class Foo {
public:
Foo();
private:
#ifdef DECLARE_MAP
std::map<std::string, std::string> m;
#endif
#ifdef DECLARE_VECTOR
std::vector<std::string> v;
#endif
};
foo.cpp:
#include "foo.hpp"
Foo::Foo()
{
}
主.cpp:
#include "foo.hpp"
int main()
{
Foo f;
}
适用于DECLARE_VECTOR
:
g++ -DDECLARE_VECTOR -c -o foo.o foo.cpp
g++ -o main main.cpp foo.o
但是会导致分段错误DECLARE_MAP
:
g++ -DDECLARE_MAP -c -o foo.o foo.cpp
g++ -o main main.cpp foo.o
可在 clang 4.0 和 gcc 4.4.7 中重现。
谁能解释为什么会这样?