2

我只是想有一双新的眼睛,下面的代码是正确的:

对象 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;
}

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

4

1 回答 1

6

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

复制 a 的语义shared_ptr,无论它是如何完成的,都是被引用对象的引用计数增加了。它只是工作。没什么可担心的。

但是,一些样式问题:

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

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

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

干杯&hth.,

于 2011-01-30T06:02:50.190 回答