静态对象上的shared_ptr好吗?
Are shared_ptr on static objects good?
我想知道静态对象上的智能指针是否合理。例如,假设我有一些静态资源,并希望将对静态资源的引用传递给需要这些资源才能使用的其他一些对象。
一种方法是使用指向该资源的 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
对象是不正确的,这样做没有任何好处。
假设我(作为类作者)不知道对象是静态的还是动态的
需要不可知的代码绝对应该使用 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
可以与"正常"shared_ptr实例互换使用。 std::shared_ptr
在这方面特别方便,因为删除器的存在与否不会影响指针类型(相比之下,std::unique_ptr<T, custom_deleter<T>>
与std::unique_ptr<T, default_deleter<T>>
是不同的类型)
指定不执行任何操作的删除程序的此方法和其他方法在以下位置进行了描述:
- 你如何使标准::shared_ptr不调用删除()
相关文章:
- C++:将控制台输出存储在宏中更好吗
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 对于下面给出的任务,使用类或多维数组更好吗
- 在C++中使用#include宏实现mixin模式好吗
- 为什么要使用引用来获取 *char?当我们使用指针时,不使用引用不是更好吗?
- 用wchar_t处理 unicode 字符好吗?它不会引起任何问题吗?
- 这种抽象模板矩阵类数据类型的方式好吗?
- 对于可移动类型,按值传递比重载函数更好吗?
- 按引用或值传递链表对象更好吗?
- std::原子布尔值或普通全局布尔值在单线程中很好吗?
- 使用嵌套的 for 循环比嵌套的 while 循环更好吗?
- "constexpr if"比开关语句好吗?
- 具有完美哈希函数的哈希表比数组好吗?
- 静态对象上的shared_ptr好吗?
- 结构中的矢量是否耗时?使用指针更好吗?
- 对于阵列复制,const&的性能更好吗?
- 在现代机器上,合并排序现在比快速排序好吗
- 这个用于地图的参考计数内存管理器的概念好吗?
- 使用SSD时,使用一个线程写入20个不同的文件比使用20个线程更好吗