我想知道静态对象上的智能指针是否合理。例如,假设我有一些静态资源,并希望将对该静态资源的引用传递给需要使用这些资源的其他对象。
一种方法是使用指向该资源的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();
}
答案 0 :(得分:7)
以下两行无效。
static SomeType st;
static shared_ptr<SomeType> pt{ &st };
如果pt
在您的流程生命周期结束时被销毁,则会delete st
。 st
从未分配过匹配的new
。这是未定义的行为。
shared_ptr
对于管理共享对象的复杂生命周期很有用,而static
对象的生命周期非常简单。使用shared_ptr
来管理static
个对象是不正确的,这样做没有任何好处。
答案 1 :(得分:-1)
让我们假设我(作为班级作者)不知道对象是静态的还是动态的
绝对需要不可知的代码应该使用shared_ptr<T>
。
您提供的此代码无效,因为它会导致删除具有静态生命周期的对象。
static SomeType st;
static shared_ptr<SomeType> pt{ &st };
这很好:
static SomeType st;
static shared_ptr<SomeType> pt{ std::shared_ptr<SomeType>{}, &st };
并且pt
可与&#34;正常&#34;互换使用shared_ptr实例。 std::shared_ptr
在这方面特别方便,因为删除器的存在与否不会影响指针类型(相反,std::unique_ptr<T, custom_deleter<T>>
是与`std :: unique_ptr&gt;不同的类型)
这个和其他指定不执行任何操作的删除器的方法描述于: