タイプのメンバー変数をstd::map
1 つのコンパイル ユニットで宣言し、他のコンパイル ユニットでは宣言しない場合、含まれているオブジェクトが破棄されているときにセグメンテーション エラーが発生します。で同じことをすると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()
{
}
main.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 で再現可能です。
なぜこれが起こるのか誰か説明できますか?