我们应该将 Singleton 类的析构函数声明为私有吗?

发布于 2025-01-15 12:36:16 字数 1227 浏览 2 评论 0原文

下面提供 Singleton 类的简单实现。只要他/她拥有对 singleInstance 的引用,任何人都可以调用析构函数。

class SomeClass {
public: /** Singleton **/
    static SomeClass &instance() {
        static SomeClass singleInstance;

        return singleInstance;
    };

private: 
    SomeClass() = default;
    SomeClass(const SomeClass&) = delete;
    SomeClass &operator=(const SomeClass&) = delete;
};

为了防止这种无意义的操作,我们是否应该在私有上下文中声明 Singleton 类的析构函数?

class SomeClass {
    // ... same above
private: 
    ~SomeClass() {}
};

堆分配的 Singleton 实例也存在该问题。考虑下面的实现。

class SomeClass {
public: /** Singleton **/
    static SomeClass &instance() {
        static SomeClass *singleInstance = nullptr;

        if(!singleInstance) {
            singleInstance = new SomeClass;
        }

        return *singleInstance;
    };

private: 
    SomeClass() = default;
    SomeClass(const SomeClass&) = delete;
    SomeClass &operator=(const SomeClass&) = delete;

    // ~SomeClass() {}
};

int main() 
{
    SomeClass *const ptr = &SomeClass::instance();

    delete ptr; // Compiles if destructor isn't private and vice versa

    return 0;
}

Providing the simple implementation of a Singleton class below. It is possible for anybody to call the destructor as long as s/he has the reference to the singleInstance.

class SomeClass {
public: /** Singleton **/
    static SomeClass &instance() {
        static SomeClass singleInstance;

        return singleInstance;
    };

private: 
    SomeClass() = default;
    SomeClass(const SomeClass&) = delete;
    SomeClass &operator=(const SomeClass&) = delete;
};

To prevent such a nonsense operation, should we declare the destructor of Singleton classes in a private context?

class SomeClass {
    // ... same above
private: 
    ~SomeClass() {}
};

The problem exists also for the heap-allocated Singleton instances. Consider the implementation below.

class SomeClass {
public: /** Singleton **/
    static SomeClass &instance() {
        static SomeClass *singleInstance = nullptr;

        if(!singleInstance) {
            singleInstance = new SomeClass;
        }

        return *singleInstance;
    };

private: 
    SomeClass() = default;
    SomeClass(const SomeClass&) = delete;
    SomeClass &operator=(const SomeClass&) = delete;

    // ~SomeClass() {}
};

int main() 
{
    SomeClass *const ptr = &SomeClass::instance();

    delete ptr; // Compiles if destructor isn't private and vice versa

    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

来世叙缘 2025-01-22 12:36:16

我们应该将 Singleton 类的析构函数声明为私有吗?

是的。

旁注:单例模式很少是必要的,不必要地使用它是一种常见的反模式。

Should we declare the desctructor of a Singleton class as private?

Yes.

Sidenote: Singleton pattern is rarely necessary, an using it unnecessarily is a common anti pattern.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文