семантика boost :: shared_ptr (копирование) - PullRequest
2 голосов
/ 30 января 2011

Я просто хотел бы по-новому взглянуть на правильность приведенного ниже кода:

Указатели, содержащиеся в объекте trifoo (хранящемся в ptr_vector), являются общими указателями f, g, h.

Также, каков результат копии shared_ptr в конструкторе trifoo; Является ли это правильным методом «совместного использования» 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 Ответ

6 голосов
/ 30 января 2011

Код представляется технически правильным.

Семантика копирования shared_ptr, как бы то ни было, заключается в том, что счетчик ссылок на объект, на который ссылаются, увеличивается.Это просто работает.Не о чем беспокоиться.

Однако некоторые проблемы со стилем:

  • Передача shared_ptr по ссылке или объявление ее const не имеет смысла.Это потому, что его всегда можно скопировать.Просто передайте эти shared_ptr по значению.

  • Используйте списки инициализатора конструктора вместо присвоений, где это практически возможно.

  • Наличие трех new в разных выражениях это очень хорошо.Это позволяет избежать исключений безопасности.Но еще лучше, поместите эту логику создания в заводскую функцию.

Cheers & hth.,

...