boost :: shared_ptr语义(复制)

时间:2011-01-30 05:06:55

标签: 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;
}

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

1 个答案:

答案 0 :(得分:6)

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

复制shared_ptr的语义虽然已经完成,但是引用对象的引用计数增加了。它只是有效。无需担心。

但有些风格问题:

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

  • 尽可能使用构造函数初始化列表而不是赋值。

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

干杯&amp;第h。,