访问单子类时,我有一个模板类ISingleton
段错误与共享指针
class ISingleton
{
public:
static T* getInstance()
{
lock_guard<mutex> guard(mMutex);
if (mInstance == NULL)
{
mInstance = new T();
}
return mInstance;
}
static void destroy()
{
lock_guard<mutex> guard(mMutex);
delete mInstance;
mInstance = NULL;
}
ISingleton(ISingleton const&) = delete;
ISingleton& operator =(ISingleton const&) = delete;
protected:
ISingleton()
{
}
virtual ~ISingleton()
{
}
private:
static T* mInstance;
static mutex mMutex;
};
父类和子类的Parent
这是一个单
class Parent
{
public:
Parent(string name) { mName = name; }
virtual ~Parent();
string getName(){ return mName; }
private:
string mName;
}
class Child : public Parent, public ISingleton<Child>
{
public:
virtual ~Child();
private:
Child() { mName = "child"; }
friend ISingleton<Child>;
};
和我创建共享指向这样的单身人士
void foo()
{
shared_ptr<Parent> module(Child::getInstance());
}
Parent *c = Child::getInstance();
c->getName(); //SEGFAULT
问题如果shared_ptr'
的引用计数达到零,则会发生。下一次拨打Child::getName
将导致段错误。我无法弄清楚它是继承问题还是单身人士本身的问题。谢谢你的建议!
你不应该把单身地址写入智能指针。您可能会返回一个shared_pointer,但是无论如何您的所有同步都会失控。 – Jarod42 2015-02-12 08:15:35
从C++ 11开始,在初始化过程中是不是保证无竞争状态的静态局部变量? – tsuki 2015-02-12 08:18:24
@ Jarod42我被迫将一个shared_ptr传递给一个Parent类型的对象到一个API。在我的情况下,它是一个单身人士的儿童类型。我知道有解决方法,但我非常感兴趣,SEGFAULT的根源是什么。 – inst27 2015-02-12 08:19:30