gpt4 book ai didi

c++ - 单例行为相关查询

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:49 26 4
gpt4 key购买 nike

我知道这是关于单例模式的非常愚蠢的问题,但它仍然是面试官的首选。 你能在下面的代码片段中告诉我吗?

(1) 在删除单例对象后,为什么我仍然能够调用 show() 方法并且它工作正常。

delete obj;
obj=NULL;
obj->show();

(2) 创建 obj1 对象后,为什么我无法打印 acquire_lock 和 release_lock 函数的内容,即使打印语句“一次”也将打印一次,如果我们增加计数器 i 那么它只打印 1 而不是 2 ,为什么?

Foo *obj1=MySingleton<Foo>::GetInstance();

(3) 对单例对象使用 unique_ptr 会产生任何负面影响。

代码片段:

#include <iostream>
#include <fstream>
#include <memory>
#include <string>

using namespace std;

static int i;

class Lock
{
public:
Lock(){};
~Lock(){};

void acquire_lock()
{
cout<<"aquired lock for class";
}

void release_lock()
{
cout<<"released lock for class";
}

};

class Foo
{
public:
void show()
{
cout<<"\ndone\n";
}
};

template <class T>
class MySingleton
{
protected:

MySingleton() {}

private:

//holds one and only object of MySingleton
static T* m_pOnlyOneInstance;
MySingleton(const MySingleton <T> &) {};
MySingleton <T> & operator=(const MySingleton <T> &) {};
~MySingleton() {};

public:

static T * GetInstance();

void foo()
{
cout<<"Mohan";
}
};


template <class T>
T* MySingleton<T>::GetInstance()
{
Lock lock;
if (m_pOnlyOneInstance == NULL)
{
lock.acquire_lock();
cout<<"one Time"<<endl;
i++;
if(m_pOnlyOneInstance == NULL)
{
m_pOnlyOneInstance = new T();
}
lock.release_lock();
}
return m_pOnlyOneInstance;
}

template <class T> T* MySingleton<T> :: m_pOnlyOneInstance=NULL;

int main()
{
//std::unique_ptr <Foo> obj (MySingleton<Foo>::GetInstance());
Foo *obj=MySingleton<Foo>::GetInstance();
//obj->show();
delete obj;
obj=NULL;
obj->show();
cout<<"\ncalling again\n";
Foo *obj1=MySingleton<Foo>::GetInstance();
obj1->show();
cout<<"i="<<i;
return 1;
}

注意:锁相关函数只是虚拟实现。

最佳答案

  1. 请记住 obj->show()相当于Foo::show(obj) .两个表达式都设置为 thisobj 的值在 show 内成员函数。现在,设置 this 会怎样?至 NULLshow 内做?没什么,因为你从不引用 this .
  2. 嗯,考虑一下您首先使用单例模式的全部原因——最多一次初始化某些东西。 “一次性”打印语句位于对象被实例化的代码中,因此它自然不会在第一次执行后执行。看GetInstance的逻辑.如果一个实例不存在,它会实例化该类(困惑......但它确实有效),然后实例存在。否则,它什么都不做。
  3. 这个问题很不清楚,但我假设你的意思是“做 std::unique_ptr<Foo> obj = MySingleton<Foo>::GetInstance(); 的负面影响是什么?”从reference可以看出对于 unique_ptr ,其目的是取得动态分配资源的所有权。当您处理单例对象时,这绝对应该发生。因为资源(在这种情况下是单例实例)在任意数量的调用者之间共享,所以单例类是唯一应该管理实例资源的类——这是单例模式的基本不变性。如果您使用 unique_ptr ,尽快obj超出范围,它会自动删除该实例,无论您的程序是否在其他地方引用现在释放的实例。

关于c++ - 单例行为相关查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31364765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com