使用静态或全局对象初始化共享指针

3 先生

以下代码显示使用全局或静态对象的地址初始化共享对象是不正确的,因为当共享指针超出范围时全局对象会被删除。

class Dog() {
public:
    void bark() {
        cout << "Dog barks" << endl;
    }
};
Dog g_Dog;
void test() {
    shared_ptr<Dog> myDog(&g_Dog);
    myDog->bark();
}
int main() {

    test();

}

上面的代码崩溃了。我的理解是我们不应该用静态或全局对象初始化共享指针,而应该只对堆中的对象进行初始化。那是对的吗 ?

我在 boost log 教程(https://www.boost.org/doc/libs/develop/libs/log/doc/html/log/tutorial/sinks.html)中看到了以下代码片段

#include <boost/core/null_deleter.hpp>

// We have to provide an empty deleter to avoid destroying the global stream object
boost::shared_ptr< std::ostream > stream(&std::clog, boost::null_deleter());
sink->locked_backend()->add_stream(stream);

你们能解释为什么代码

  boost::shared_ptr< std::ostream > stream(&std::clog, boost::null_deleter()); 

不会造成任何问题。看起来 std::clog 是全局变量或静态变量。不是吗?当上述流共享指针超出范围时,为什么它不会造成被破坏的风险。请说明一下。谢谢

丹尼斯

从链接null_deleter: boost::null_deleter 函数对象可以用作具有智能指针(例如 unique_ptr 或 shared_ptr )的删除器。删除器不会对释放时提供的指针执行任何操作,这使得它在指向的对象在别处释放时非常有用。

换句话说,使用 null_deleter,智能指针永远不会尝试删除指向的对象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何找到全局静态初始化

指向对象初始化线程安全的静态指针

什么时候使用外部链接初始化全局常量免受静态初始化顺序的破坏?

C ++模板:全局对象中的静态成员未初始化

未使用的全局的静态初始化器

如何使用nullptr初始化相同类的对象的静态指针数组?

本地/全局对象的C ++初始化

如何初始化指向extern变量的全局指针?

静态全局变量初始化顺序

静态初始化包含函数指针的对象的constexpr std :: array

使用共享指针初始化动态分配的结构

如何在对象中初始化指针的静态数组

如何通过延迟初始化共享全局变量?

如何从指针初始化堆栈对象?

使用PowerMock在JUnit Suite中共享静态初始化

使用DLL且全局声明的指针未正确初始化的循环队列

如何使用函数指针作为参数初始化模板的静态成员

初始化指向对象数组的指针

初始化静态指针数组

使用指向extern变量的指针进行静态初始化

在Vector C ++中使用指针成员初始化对象

无法初始化全局对象

使用指针时未初始化的对象

使用统一初始化初始化对象和指针对象不起作用

函数指针的静态初始化

如何使用 gdb 跟踪在 main() 之前初始化的所有静态全局变量

初始化我想跨多个线程共享的静态对象的最佳方法是什么

使用 `thread_local!` 和 `OnceCell` 在多个线程之间共享包含 `Rc` refs 的静态延迟初始化对象

C:使用指针静态初始化复合结构