为unique_ptr重新计数的替代方法
Alternatives to refcount for unique_ptr
在下面的代码示例中,只要B
的任何对象存在,结构体B
中就应该存在一个结构体A
的实例。
#include <memory>
#include <iostream>
#include <mutex>
struct A
{
A() { std::cout << "A() called" << std::endl; }
~A() { std::cout << "~A() called" << std::endl; }
};
struct B
{
B()
{
std::cout << "B() called" << std::endl;
std::lock_guard<std::mutex> guard(mtx);
if( !refCount )
{
a.reset( new A );
}
++refCount;
}
~B()
{
std::cout << "~B() called" << std::endl;
std::lock_guard<std::mutex> guard(mtx);
--refCount;
if( !refCount )
{
a.reset( );
}
}
static std::unique_ptr<A> a;
static std::mutex mtx;
static int refCount;
};
std::unique_ptr<A> B::a;
int B::refCount(0);
std::mutex B::mtx;
int main()
{
{
B b1; //B::a should be created here
B b2;
} //B::a should be destroyed here
B b3; // B::a should be recreated here
} //B::a should be destroyed again here
参见http://coliru.stacked-crooked.com/a/fea428254933ee5c
我的问题是:有没有一个替代的(线程安全的!)实现没有重新计数?这是否可能用std::shared_ptr
和std::weak_ptr
的结构来解决?
确保一个对象与B
的任何对象一样存在的唯一方法是保持B
对象的重新计数。这是判断是否存在任何活动的B
对象,以及它们是否会在程序运行时被任意创建和销毁的唯一现实的方法。
std::shared_ptr
在内部保留了自动跟踪的refcount。这可能是一个更好的主意,使用这些,而不是手动管理自己的回扣;这样,您就不必一丝不苟地实现所有的RAII构造器,或者重新发明轮子。
这是需要的解决方案:
#include <memory>
#include <iostream>
#include <mutex>
using std::shared_ptr;
using std::weak_ptr;
struct A
{
A() { std::cout << "A() called" << std::endl; }
~A() { std::cout << "~A() called" << std::endl; }
};
struct B
{
B()
{ std::cout << "B() called" << std::endl;
std::lock_guard<std::mutex> guard(mtx);
if (!(ac =aw.lock()))
aw =ac =shared_ptr<A>(new A);
}
~B()
{ std::cout << "~B() called" << std::endl;
}
shared_ptr<A> ac;
static weak_ptr<A> aw;
static std::mutex mtx;
};
weak_ptr<A> B::aw;
std::mutex B::mtx;
int main()
{
{
B b1; //B::a should be created here
B b2;
} //B::a should be destroyed here
B b3; // B::a should be recreated here
} //B::a should be destroyed again here
生成与示例相同的输出:
B() called
A() called
B() called
~B() called
~B() called
~A() called
B() called
A() called
~B() called
~A() called
相关文章:
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- C++11 迭代向量的新方法?
- 将 malloc 转换为新的正确方法
- 从 Rcpp 函数返回指向"新"对象的指针的正确方法
- 使用新运算符C++创建多维数组的简单方法
- 计数用红色着色m灰色块的方法,其中红色块应以计数至少为n的组进行
- 有没有一种优雅的方法可以使用向量修改器并获得新的向量,而不是更改原始向量
- 有没有一种方法可以从函数中返回一个新对象或对现有对象的引用
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 从工厂方法返回的ComPtr的引用计数增加两次
- 使用新的c++返回值语法的Const方法
- C++ 实例化新对象时不接受继承方法默认参数值
- 实例化新类时未调用的方法
- 主窗口的新方法不可见
- 我可以制作一个对象方法,如果单独调用,它将自行修改,但如果在复制初始化期间调用,则会返回一个新对象?
- 需要帮助从12个字节生成新的24字节RGB查找阵列,或者是一种更好的编码方法
- C ++中新分配的int的内存大小,有没有不同更好的方法来查看它?
- 编写链接函数的更短/更有效的方法,该函数按字典顺序添加新元素
- 更好的方法? 新指针,需要删除吗?
- 获取非静态方法参数计数