【发布时间】:2013-03-06 08:25:13
【问题描述】:
我在 main 的同一个文件中定义了一个类,在 2 个单独的文件中定义了另一个类(充满静态函数/成员),它崩溃了。我想这可能与全局/静态实例的生命周期有关。似乎在ctor中,静态成员尚未初始化,并且可能会在退出时,在第一个实例被破坏之前释放静态成员。 这是测试代码:
//testh.h
#include <map>
class Sc {
public:
static void insert();
static void out();
private:
static std::map<int, int> map_;
};
//testcpp.cpp
#include "testh.h"
#include <iostream>
std::map<int, int> Sc::map_;
void Sc::insert() {
map_.insert(std::make_pair(2,3));
}
void Sc::out() {
for(auto m : map_) {
std::cout << m.first << ' ' << m.second << '\n';
}
}
//main.cpp
#include "testh.h"
class Nc {
public:
Nc() {
Sc::insert();
Sc::out();
}
~Nc() {
Sc::insert();
Sc::out();
}
};
Nc nc;
int main() {
system("pause");
return 0;
}
以下是上述代码的一些奇怪行为:
如果我将 staic 成员替换为 int,它不会崩溃,所以我认为 std::map 可能有问题?
如果我把所有代码都放到main.cpp中,它不会崩溃,但是这些代码不会生成相同的代码吗?
如果我不想做动态分配如何解决这个问题(新)?
【问题讨论】:
-
你有两个
class Sc,一个在main.cpp另一个在testh.h? -
我可以保证std中没有任何问题。
-
@billz 这是 main.cpp 中的另一个类 Nc,testcpp.cpp/testh.h 中的 Sc
-
testcpp.cpp 中没有析构函数。这可能是一个原因吗?也许摧毁地图会有所帮助。
-
@lost_with_coding map_ 不是指针,如何销毁它?它是静态的,会自动回收
标签: c++ static-members