以下代码显示使用全局或静态对象的地址初始化共享对象是不正确的,因为当共享指针超出范围时全局对象会被删除。
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] 删除。
我来说两句