gpt4 book ai didi

c++ - boost::shared_ptr 和 boost::shared_ptr 是否共享引用计数?

转载 作者:IT老高 更新时间:2023-10-28 23:14:23 25 4
gpt4 key购买 nike

关于 boost::shared_ptr 的陷阱有几个有趣的问题。 s。其中之一是避免指向 boost::shared_ptr<Base> 的有用提示。和 boost::shared_ptr<Derived>Derived 类型的同一对象因为它们使用不同的引用计数并可能过早地销毁对象。

我的问题:同时拥有 boost::shared_ptr<T> 是否安全?和 boost::shared_ptr<const T>指向 T 类型的同一对象,或者这会导致同样的问题吗?

最佳答案

绝对安全。

以下代码示例:

#include <iostream>
#include <boost/shared_ptr.hpp>

int main(int, char**)
{
boost::shared_ptr<int> a(new int(5));
boost::shared_ptr<const int> b = a;

std::cout << "a: " << a.use_count() << std::endl;
std::cout << "b: " << b.use_count() << std::endl;

return EXIT_SUCCESS;
}

编译运行良好,完全正确。它输出:

a: 2
b: 2

这两个shared_ptr共享同一个引用计数器。


还有:

#include <iostream>
#include <boost/shared_ptr.hpp>

class A {};
class B : public A {};

int main(int, char**)
{
boost::shared_ptr<A> a(new B());
boost::shared_ptr<B> b = boost::static_pointer_cast<B>(a);

std::cout << "a: " << a.use_count() << std::endl;
std::cout << "b: " << b.use_count() << std::endl;

return EXIT_SUCCESS;
}

以同样的方式行事。但是,您必须从不使用如下构造构建您的 shared_ptr:

boost::shared_ptr<A> a(new B());
boost::shared_ptr<B> b(static_cast<B*>(a.get()));

a.get() 给出原始指针并丢失有关引用计数的所有信息。这样做,您最终会得到两个不同的(未链接的)shared_ptr,它们使用相同的指针但不同的引用计数器。

关于c++ - boost::shared_ptr<T> 和 boost::shared_ptr<const T> 是否共享引用计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3828497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com