std :: vector - как освободить память элементов char * в векторе? - PullRequest
2 голосов
/ 13 марта 2012

Рассмотрим следующие коды C ++:

using namespace std;
vector<char*> aCharPointerRow;
aCharPointerRow.push_back("String_11");
aCharPointerRow.push_back("String_12");
aCharPointerRow.push_back("String_13");
for (int i=0; i<aCharPointerRow.size(); i++)  {
   cout << aCharPointerRow[i] << ",";
}
aCharPointerRow.clear();

После строки aCharPointerRow.clear(); все элементы указателя символов в aCharPointerRow должны быть удалены.

Есть ли утечка памяти в приведенном выше коде C ++? Нужно ли явно освобождать память, выделенную для строк char *? Если да, то как?

Спасибо за любые предложения.

Ответы [ 4 ]

7 голосов
/ 13 марта 2012

Есть ли утечка памяти в приведенном выше коде C ++?
Нет утечки памяти.

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

Обратите внимание, что в идеале Вы должны использовать вектор std::string.

std::vector<std::string> str;
str.push_back("String_11");
str.push_back("String_12");
str.push_back("String_13");

Вы можете использовать std :: string.c_str () в случае, если вам нужно получить базовый символьный указатель (char *), который из C api ожидает как параметр.

5 голосов
/ 13 марта 2012

Вы вставляете свои векторные строковые литералы (строки в "..."). Они не выделены вами. Они даются вам компилятором / средой исполнения C ++, и у них есть время жизни, равное времени жизни приложения, поэтому вы не можете / не должны освобождать их.

См., Например, Область действия (строковых) литералов

Обратите внимание, что все, что я вам говорил, основано на том факте, что вы используете строковые литералы. Если вам нужно выделить память для ваших строк, вам придется использовать некоторые автоматические деаллокаторы, такие как std::unique_ptr (из C ++ 11) или boost::unique_ptr или boost::shared_ptr (из Boost), или лучше использовать класс std::string как предложено Алс

2 голосов
/ 13 марта 2012

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

Но это также плохо написанный код: строковые литералы являются константными, но C ++ позволяет ссылаться на них как на символ *сохранить обратную совместимость библиотеки CЕсли вы намереваетесь ссылаться на строковые литералы, вам лучше использовать const char* вместо char* (в случае попытки их изменения вы получите ошибку компилятора, а не исключение времени выполнения)

Еще одна плохая вещьздесь, в том, что в более обширном коде вы рано или поздно теряете контроль над тем, что char * эффективно хранится в векторе: всегда ли они предоставляются как строковые литералы, или они также могут быть каким-то другим образом распределены динамическим символом [] ??И кто несет ответственность за их распределение / освобождение?

std :: vector ничего не говорит об этом, и если вы находитесь в позиции, вы не можете дать четкий ответ на поставленные выше вопросы (каждый упомянутый const char* буфер может существовать вне области существования вектора или нет), вам, вероятно, лучше использовать std::vector<std::string> и рассматривать строки как «значения» (не относящиеся к объектам), позволяя строковому классу выполнять грязную работу.

1 голос
/ 13 марта 2012

Нет утечки. Пока вы не делаете копию этих строк, вам не нужно явно удалять или освобождать их ().

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