我正在研究设计模式中的单例,我看到了这个单例实现,并用
fsanitize=address
测试了它,因为没有delete
关键字,即使有一个new
关键字正在使用我怀疑这是一个实现不完整,因此存在内存泄漏,但运行程序后似乎没有内存泄漏?这是为什么?我们正在为 *singleton
分配新内存,所以它应该是一个悬空指针?
class Singleton {
public:
static Singleton& instance() {
static Singleton* singleton = new Singleton();
return *singleton;
}
void set_data(int value) { data = value; }
int get_data() { return data; }
private:
Singleton() : data(0) {}
~Singleton() {}
int data;
};
为什么这个单例实现在 C++ 中不会泄漏内存?
如果我将这个单例类重写为如下所示:
class Singleton {
public:
static Singleton& instance() {
static Singleton* singleton;
if (singleton == nullptr) {
singleton = new Singleton();
}
return *singleton;
}
void set_data(int value) { data = value; }
int get_data() { return data; }
private:
Singleton() : data(0) {}
~Singleton() { delete this; }
int data;
};
会有什么不同?
为什么这个单例实现在 C++ 中不会泄漏内存?
这个单例实现确实会泄漏内存。
也就是说,内存在程序终止前立即泄漏,因此泄漏并不重要。这是一种常见的技术,可用于加快终止时间,并避免某些罕见的静态破坏订单惨败情况。