c++ - boost::shared_ptr 语义(复制)

标签 c++ pointers boost shared-ptr ptr-vector

我只是想用新的眼光来看看下面的代码是正确的:

对象 trifoo 中包含的指针(存储在 ptr_vector 中)是共享指针 f、g、h。

另外,trifoo的构造函数中的shared_ptr复制的结果是什么;这是“共享”shared_ptr 的正确方法吗?确保引用计数增加等。我能够测试验证所有其他疑问,但我不确定如何(正确)检查这一点。也欢迎大家批评指正。

#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/shared_ptr.hpp>

class foo {
    int a, b;
public:
    foo(int A, int B) : a(A), b(B) {}
};

typedef boost::shared_ptr<foo> foo_ptr;

class trifoo {
    foo_ptr c, d, e;
public:
    trifoo(const foo_ptr& C, const foo_ptr& D, const foo_ptr& E) : c(C), d(D), e(E) {}
};

int main() {
    for (int i = 0; i < 5000000; i++) {
        foo_ptr f(new foo(1,2));
        foo_ptr g(new foo(2,3));
        foo_ptr h(new foo(4,5));

        boost::ptr_vector<trifoo> tris;

        tris.push_back(new trifoo(f, g, h));
    }

    return 0;
}

注意:无意义的循环是为了测试内存泄漏,但没有发生。

最佳答案

该代码在技术上似乎是正确的。

复制shared_ptr的语义,无论是如何完成的,都是增加了所引用对象的引用计数。它就是有效的。没什么可担心的。

不过有一些风格问题:

  • 通过引用传递shared_ptr,或声明它const,是没有意义的。那是因为它总是可以被复制。只需按值传递这些 shared_ptr 即可。

  • 在实际可能的情况下,使用构造函数初始值设定项列表而不是赋值。

  • 将三个 new 放在不同的表达式中是非常好的。它避免了异常安全陷阱。但更好的是,将该创建逻辑放入工厂函数中。

干杯,

关于c++ - boost::shared_ptr 语义(复制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4841282/

相关文章:

c++ - 使用 Boost.build 构建并链接到 boost

c++ - 我如何在初始化列表中的构造函数之后初始化变量/对象?

c++ - typedef 标准容器?

c++ - 改变我加载资源的方式

c - 使用 malloc 为结构分配内存,其中数据条目之一是指针

c - C 中奇怪的指针行为

C++ 模板代码适用于 msvc 2015 但不适用于 2017

c++ - 读取存储在 double 中的 8 字节字段的 4 个字节

c - 错误 : initializer element is not constant in assigning structure pointers

gcc - 与 OS X 10.10.2 的 "__mpf_struct"相关的 undefined symbol 错误