【发布时间】:2014-12-09 01:19:54
【问题描述】:
我开始学习 C++,但我不明白这是内存泄漏还是某种巫术?!
我有一些“单例”类(只是为了演示):
#include <iostream>
using namespace std;
class S {
private: S() {
cout << "S::S" << endl;
}
public: static S* instance() {
static S* i;
if(i == NULL) {
cout << "Create S" << endl;
i = new S;
}
return i;
}
public: virtual ~S() {
cout << "S::~S" << endl;
}
public: void a() {
cout << "S::a" << endl;
}
};
int main() {
// call some method
S::instance()->a();
// delete pointer to instance (no reason, because I'm curious)
delete S::instance();
// call method again
S::instance()->a();
return 0;
}
这些输出是:
Create S
S::S
S::a
S::~S
S::a
所以我的问题是:为什么在调用析构函数后,静态变量中仍然有类 S 的工作副本?
更新:感谢您的回答。我意识到我的错误。请原谅我的打扰。
【问题讨论】:
-
你没有工作副本,你有一个 dangling 指针并且真的触发了未定义的行为..(顺便说一句 - 你不需要
public:之前 每个方法这不是java.. -
(顺便说一句 - 对不赞成的选民来说 - 给初学者投票有点苛刻 - 特别是没有任何关于原因的评论!)
-
I don't understand this is memory leak or some kind of voodoo magic底线是这样的——不像大多数其他语言,在 C++ 中,做“坏事”并不意味着代码会崩溃,获取堆栈跟踪,弹出一个消息框说“你做了一件坏事”等等。因此,您得到的答案不仅适用于您的问题,还适用于任何碰巧编译没有错误但似乎运行正常的“疯狂”C++ 代码。
标签: c++ delete-operator static-functions