Объявление переменной метода C ++ - PullRequest
1 голос
/ 04 декабря 2010

В настоящее время я изучаю исходный код C ++.Я не разработчик C ++.

void SomeClass::SomeMethod() const 
{ 
    vector<Thing> things(count); 

    ...
    //Elements are added or replaced in things but no deallocation of things here
}

SomeMethod вызывается много раз.Может ли кто-нибудь подтвердить, что утечки нет и things выделено только один раз, ссылка будет принята.

Ответы [ 4 ]

5 голосов
/ 04 декабря 2010

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

У вас есть 2 решения, чтобы избежать этого:

  • (предпочтительно) Сделать этот вектор классомполе (с атрибутом mutable для возможности его изменения методом const),
  • Сделать этот вектор статической переменной.
2 голосов
/ 04 декабря 2010

"вещи" - это локальная автоматическая переменная.В другом посте есть ответ на этот вопрос: Где хранятся локальные, глобальные, статические, автоматические, регистровые, внешние, постоянные, переменные переменные?

2 голосов
/ 04 декабря 2010

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

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

Невозможно бытьболее определенным, не видя весь код в методе и в Thing, но это использование на первый взгляд правильно.

1 голос
/ 04 декабря 2010

Это лежит локально в этой функции. Когда он выходит из области видимости, он самостоятельно делокатирует память; все контейнеры STL делают.

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