2014-08-22 4 views
7

Я пишу код с большим количеством векторов STL в нем. Я думаю, что я структурировал его так, что это все ссылки и перемещение конструкторов, но я бы хотел автоматизированный способ быть уверенным. Есть ли способ получить предупреждение или ошибку при вызове конструктора копирования?Можно ли отключить конструктор копирования std :: vector?

Я не хочу писать свой собственный класс векторов или изменять заголовки STL. Не указывайте этот дубликат подобных вопросов у людей, которые пишут собственные классы: я не хочу этого делать.

ответ

8

Помимо отключения конструктора копирования и оператора назначения копирования типа, хранящегося внутри вектора, вы не сможете отключить векторные копии без изменения исходного кода вектора.

У вас есть несколько вариантов.

Вы можете проверить, присутствует ли конструктор векторной копии в вашем двоичном формате; оптимизатор должен устранить его, если он никогда не используется.

Вы можете использовать конструктор копирования типа, содержащегося внутри вектора, и посмотреть, как часто он вызывается.

Вы можете поместить контрольную точку на конструктор копирования (или на одну из вспомогательных функций, которые она вызывает, и проверить стек вызовов при попадании, чтобы увидеть, был ли это вызван конструктор копирования).

Или вы можете временно обернуть вектор своим собственным классом и удалить его конструктор копирования.

+1

решения точки останова довольно просто и легко реализовать – pqnet

+0

точки останова идеи гораздо лучше, чем у меня – programmerjake

+3

@programmerjake: Я думаю, что многое стало ясно, когда вы сказали '#define вектор my_vector' :-) –

2

Вместо того, чтобы писать собственный класс vector, вы можете создать класс, который происходит от vector и реализует все конструкторы, кроме конструктора копирования. то вы бы #define vector my_vector. , очевидно, это нужно сделать только для поиска вызовов конструктора-копии, а затем этот код должен быть прокомментирован. это должно быть только 50-100 строк вместо строк 1k для вашего собственного класса векторов.

2

Вы можете использовать std::unique_ptr<std::vector>, хотя для косвенности будет немного накладных расходов, а много . необходимо изменить на ->. Это поможет вам предотвратить копирование без каких-либо взломов.

Смежные вопросы