我想知道静态对象上的智能指针是否合理。例如,假设我有一些静态资源,并且想将对该静态资源的引用传递给需要使用这些资源的其他一些对象。
一种方法是使用指向该资源的RAW指针。但是现在我想知道智能指针(shared_ptr)是否是更好的方法,如果是的话,如何正确地做到这一点。 (智能指针也应该是静态的吗?)。
问题的背景:如果不再有持有智能指针的对象,则将释放智能指针指向的静态对象(这不是最好的主意...)。
一个示例(在运行时结束时崩溃):
struct SomeType {
SomeType() { cout << "ctor..." << endl; }
~SomeType() { cout << "dtor..." << endl; }
void sayHello() { cout << "Hello!" << endl; }
};
void someFunction(shared_ptr<SomeType> smartPointer) {
smartPointer->sayHello();
}
static SomeType st;
static shared_ptr<SomeType> pt{ &st };
void anotherFunction() {
someFunction(pt);
}
int main() {
anotherFunction();
cin.get();
}
最佳答案
以下两行无效。
static SomeType st;
static shared_ptr<SomeType> pt{ &st };
当
pt
在您的进程生命周期结束时被销毁时,它将为delete st
。从来没有为st
分配匹配的new
。这是未定义的行为。shared_ptr
对于管理共享对象的复杂生存期非常有用,而static
对象的生存期非常简单。使用shared_ptr
管理static
对象是不正确的,这样做没有任何好处。