Управление областью действия и временем жизни объектов в векторах STL - PullRequest
8 голосов
/ 24 августа 2011

Исходя из мира C #, я изо всех сил стараюсь не допускать утечек памяти и ошибок в проекте C ++, которому я был назначен.Я пишу код, который использует структуры для анализа информации из буфера данных.Поскольку число структур данных, которые появляются в буфере, может изменяться во время выполнения, вектор stl используется для хранения обработанных данных.Я наткнулся на следующий блок кода в существующем программном обеспечении и с трудом понимаю, почему оно работает:

MyVectorOfObjects.clear();
for (unsigned __int8 i = 0; i < NumberOfObjects; i++)
{
    MyParserObject parserObject;                // Declaring without 'new'?
    parserObject.Decode(buffer, offset, size);  // A method on the struct.
    MyVectorOfObjects.push_back(parserObject);  // Does this keep parserObject in scope?
}

Мои конкретные вопросы:

  1. Согласно этот вопрос , не будет ли parserObject выходить за рамки каждой итерации, поскольку ключевое слово new не используется?Очевидно, этот код работал.

  2. В этом случае размещение объекта в vector сохраняет parserObject в области видимости?

  3. Согласно этому вопросу , parserObject копируется.Если это так, как это влияет на производительность (например, потребление памяти, выделение памяти и т. Д.)?Кроме того, копируемые объекты parserObject затем принимают ту же область, что и вектор?

Спасибо за любую помощь.

Ответы [ 2 ]

7 голосов
/ 24 августа 2011
  1. Да, экземпляр parserObject, объявленный в цикле for, выходит из области действия каждый раз, когда цикл повторяется.

  2. Нет, размещение parserObject в vector не удерживает этот объект в области видимости. Метод push_back() сделает копию этого объекта, который теперь принадлежит vector. Вы должны убедиться, что ваши объекты могут быть надлежащим образом скопированы (может понадобиться конструктор копирования и оператор присваивания). Копии, содержащиеся в векторе в этом примере, принадлежат вектору и будут иметь время жизни объекта, подобное самому vector.

  3. Копируется paserObject, что может повлиять на использование памяти и производительность. Если parserObject копировать нетривиально, то это может быть дорогостоящей операцией. Это полностью зависит от вашей реализации parserObject.

4 голосов
/ 24 августа 2011
MyVectorOfObjects.push_back(parserObject);  // Does this keep parserObject in scope?

push_back делает копию объекта и сохраняет его.

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

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