2016-01-20 12 views
-1

Помогите мне понять это. Вот контекст.Что именно происходит, когда я делаю buffer1.push_back (buffer2.front()) в C++?

  • Я пишу программу на C++.
  • У меня есть 2 буфера (deque). Назовем их buffer1 и buffer2;
  • У меня есть 2 потока: один поток заполняет buffer1 со случайными значениями. Другой - копирование самого старого значения buffer1 в buffer2;
  • Я использую мьютексы.

Я хочу, чтобы скопировать значение в 1-й позиции buffer1 к Буфер2 и для того, чтобы выполнить, чтобы сделать это, я пишу следующую строку кода:

НИТИ 1

double a = 20.1; 
    buffer1.push_back(a); 

НИТИ 2

buffer2.push_back(buffer1.front()); 

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

спасибо, все.

+1

Что находится внутри ваших контейнеров? В идеале вы бы предоставили [MCVE]. – 5gon12eder

+3

Была ли документация для ['front'] (http://en.cppreference.com/w/cpp/container/deque/front) и [' push_back'] (http://en.cppreference.com/w/ cpp/container/deque/push_back) непонятно, что происходит? – NathanOliver

+3

Вам нужны мьютексы – AndyG

ответ

2

Для начала рассмотрим функции, которые вы вызываете. Функция std::deque::push_back принимает свой аргумент по ссылке, поэтому копирования не происходит. И std::deque::front возвращает reference (или const_reference), так что никакого копирования там тоже нет.

Теперь давайте взглянем на нижележащего контейнера, который по умолчанию std::vector, и это та же самая история с его push_back и front функций как для std::deque.

Однако если присмотреться на std::vector::push_back ссылки, вы увидите, что для первой перегрузки данных должны быть CopyInsertable, потому что это на самом деле, как инициализируется элемент внутри вектора, путем копирования объекта, который вы «толчок назад "(или перемещение, если ваш компилятор и тип данных поддерживают его).

Итак, в конце, если у вас есть сложный класс, вы должны следовать the rules of three, five or zero, и если это так, то вы должны быть в порядке и не иметь проблемы с памятью в отношении этого в любом случае. Если вы do следуйте правилам три, пять или ноль, и все еще есть проблемы, тогда проблема может быть где-то еще. Попробуйте использовать отладчик памяти, например, например. Valgrind или аналогичный. И если у вас многопоточное приложение, вам необходимо защитить ресурсы, которые могут быть изменены несколькими потоками одновременно (с использованием, например, мьютексов или семафоров).

0

В соответствии с this станд :: Deque :: фронт возвращает ссылку на первый элемент:

Deque :: передний:

Возвращает ссылку на первый элемент в контейнере Deque.

И согласно this :: push_back дека копии (или движется) содержание данного элемента:

Deque :: push_back:

добавляет новый элемент в конце контейнер deque, после его текущий последний элемент. Содержимое val копируется (или перемещается) в новый элемент .

0

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

double a = 20.1; 
buffer1.push_back(a); 
buffer2.push_back(buffer1.front()); 

в этом случае все идет нормально, или с этой последовательностью:

buffer2.push_back(buffer1.front()); 
double a = 20.1; 
buffer1.push_back(a); 

в этом случае вы звоните buffer1.front() на пустой контейнер. Конструктор копирования вызывается на случайные данные и дает проблемы с памятью.

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

  • Нет связанных вопросов^_^