静态指针+公共构造函数

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

[[使用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被覆盖?此模式可能有哪些用例?

c++ oop pointers static
3个回答
2
投票

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

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()中创建一个实例,并且该实例一直存在于整个程序中),那很安全但是只有在这种情况下-您必须纪律严明,以使其保持有效。


0
投票

我认为这很有趣。它不是常规的单例,但在某些方面相似。

考虑此场景:

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

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

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