C++中单例实例实现如何不泄漏内存?

问题描述 投票:0回答:1

我正在研究设计模式中的单例,我看到了这个单例实现,并用

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++ design-patterns memory-management singleton implementation
1个回答
0
投票

为什么这个单例实现在 C++ 中不会泄漏内存?

这个单例实现确实会泄漏内存。

也就是说,内存在程序终止前立即泄漏,因此泄漏并不重要。这是一种常见的技术,可用于加快终止时间,并避免某些罕见的静态破坏订单惨败情况。

© www.soinside.com 2019 - 2024. All rights reserved.