Почему это вызывает конструктор копирования так много раз? - PullRequest
2 голосов
/ 09 ноября 2010

У меня есть класс, который похож на это:

Однако после исходного конструктора конструктор копирования вызывается 10 раз. Если я не сделаю шаг создания потока. Он вызывается 4 раза, чего я и ожидал. Почему это так и как мне этого избежать?

Стоит ли в этом случае избегать использования std :: vector и просто вместо этого делать новое удаление?

#include <cstdio>
#include <vector>

class A
{
    public:
        A() { printf("hello\n"); }
        ~A() { printf("Goodbye\n"); }
        A(const A&)
        {
            printf("copy constructing\n");
        }

        Thread() { }
};


int main()
{
    std::vector<A> a(4, A);

    for (int i = 0; i < a.size(); i++){
        threads_.create_thread(boost::bind(&A::Thread, a[i]));
    }
}

Хорошо, я нашел проблему.

Это:

        threads_.create_thread(boost::bind(&A::Thread, a[i]));

Должно быть:

        threads_.create_thread(boost::bind(&A::Thread, &a[i]));

Ответы [ 2 ]

3 голосов
/ 09 ноября 2010

Взгляните на Boost.Ref

for (int i = 0; i < a.size(); i++){
     threads_.create_thread(boost::bind(&A::Thread, boost::ref(a[i]) ));
}

это из Boost.Bind :

Аргументы, которые принимает bind: скопированы и хранятся внутри возвращенный объект функции. Например, в следующем коде:

int i = 5;

bind (f, i, _1);

копия значения i хранится в объект функции. повышение :: исх и boost :: cref можно использовать для объект функции хранит ссылку к объекту, а не к копии:

int i = 5;

bind (f, ref (i), _1);

bind (f, cref (42), _1);

1 голос
/ 09 ноября 2010

Темы здесь не имеют значения.«Проблема» с boost::bind;он создает копии аргументов, которые вы ему передаете, поэтому он может использовать значение позже при вызове. Используйте ref, поэтому вместо этого сохраните ссылку.

Следует ли в этом случае избегать использования std :: vector и просто вместо этого делать новое удаление?

А?Почему ты бы так поступил?Вам нужно преодолеть тот факт, что копии сделаны;это просто происходит.Вы должны беспокоиться о том, чтобы сначала написать чистый, поддерживаемый код, а не о том, хотите ли вы сделать копию.Нет смысла использовать new[] вместо std::vector; никогда использовать delete.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...