【问题标题】:Static pointer + public constructor静态指针 + 公共构造函数
【发布时间】:2020-03-25 08:48:31
【问题描述】:

[使用 C++] 我知道 Singleton 的模式,其中构造函数是 private,并且有一个指向 class 的静态指针,从某个 static GetInstance() 函数返回。但是什么时候需要公共构造函数的类,比如这个:

//hpp file
class MyClass{
    static MyClass * myptr;
public:
    static const MyClass * GetInstance() { return myptr; }

    MyClass() { myptr = this };
    ~MyClass() {}
    ...
}

//cpp file
MyClass * MyClass::myptr = nullptr;

每次我们使用构造函数创建新对象时会发生什么? myptr 被覆盖?这种模式有哪些可能的用例?

【问题讨论】:

  • 简单的答案是永远不需要这种代码。它从何而来?它的作者认为有什么好处?
  • 另外,你将如何删除与这条指令MyClass() { myptr = this };相关的myptr被覆盖的实例?
  • 它来自我正在使用的代码库
  • @user2376997 如果可能,您应该与代码的作者交谈。但对我来说,这只是看起来很糟糕的代码。
  • GetInstance 应该重命名为GetLastInstance,但~MyClass() {} 所以会创建悬空指针...

标签: c++ oop pointers static


【解决方案1】:

这可能会导致可怕的事情出错。例如:

void func()
{
    MyClass obj; // Memory allocated on stack here and put into static pointer
} // Stack memory deallocated here

int main()
{
    func();

    const MyClass* ptr = MyClass::GetInstance(); // Dangling pointer
}

不要这样做。

【讨论】:

    【解决方案2】:

    每次我们使用构造函数创建新对象时会发生什么? myptr 被覆盖?

    是的。

    这种模式有哪些可能的用例?

    我能想到的一个非常简化的单例用法 - 如果您100% 确定只会创建一个对象(例如,您在 main() 中创建一个实例,它通过整个程序),那么它是相当安全的。但只有在这种情况下 - 您必须非常自律才能保持有效。

    【讨论】:

      【解决方案3】:

      我觉得这很有趣。它不是普通的单例,但在某些方面很相似。

      想想这个场景:

      1. 多个线程维护MyClass::myptr,每个线程都可以覆盖它。

      2. 多个线程使用MyClass::myptr作为常规单例(实际上不是)。

      【讨论】:

        猜你喜欢
        • 2011-03-01
        • 1970-01-01
        • 2011-10-23
        • 1970-01-01
        • 2020-07-15
        • 1970-01-01
        • 2012-09-27
        • 1970-01-01
        • 2013-01-03
        相关资源
        最近更新 更多