2010-12-04 1 views
1

В настоящее время я изучаю этот исходный код на C++. Я не разработчик 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 выделяется только один раз, ссылка будет оценена.

+1

Он назначается один раз за вызов функции. Без дополнительного кода вы не можете получить правильный ответ о том, правильно ли это использование или может быть заменено чем-то менее дорогостоящим в распределении и выпуске памяти. –

ответ

5

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

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

  • (предпочтительно) Сделать этот вектор поле класса (с атрибутом mutable для того, чтобы позволить ему быть изменено методом const)
  • Сделать это вектор статической переменной.
+1

+1, но, сказав, что после установки члена или статики вам придется добавить некоторый управляющий код, чтобы ограничить перераспределение, сначала с помощью функции reserve() вектора vector, затем, пытаясь получить максимальный размер en, зарезервируйте его с начала и после что убедитесь, что вектор очищен перед новым использованием. – Klaim

+1

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

+0

Вам нужно будет увидеть намного больше кода, прежде чем знать, что выделение одноточечных «вещей» подходит, не так ли? Не факт, что эта функция 'const' предполагает, что исходный кодер знает в какой-то степени, что они делают? –

2

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

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

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

1

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