S>>как правильно осободить память для каждого элемента массива arr?
__>Правильное решение пользоваться std::vector вместо динамического массива. __>Он заботится об освобождении памяти сам. __>И тогда такие вопросы отпадут сами
Нет, меня не интерсует на данный момент std::vector, как им пользоваться я знаю.
Я пять лет не садился за C++ и мне нужно вспомнить как правильно работать с указателями.
Здравствуйте, Greg Zubankov, Вы писали:
GZ>Здравствуйте, sps608, Вы писали:
S>>как правильно осободить память для каждого элемента массива arr? GZ>В обратном порядке:
GZ>
Здравствуйте, sps608, Вы писали:
S>если сделать так:
S>
S> for (int i = 0; i < DataSize; ++i)
S> {
S> delete[] arr;
S> arr++;
S> }
S>
S>то после превого цикла получаю, что arr bad pointer...
так ты сразу первым delete удаляешь массив указателей, так что arr указывает после этого указывает в никуда
Здравствуйте, sps608, Вы писали:
S>Получаю ошибку: "Heap corruption detected: after Normal block #212 at .... CRT detected that te apllication wrote to memoryafter end of heap buffer"
Код корректный, может у тебя где-то еще ошибка.
Посмотри короткий пример на основе твоего. Здесь нет утечек памяти.
typedef char* PChar;
void FillString(PChar *data, int DataSize){
for (int i = 0; i < DataSize; i++)
{
*data = new char[123];
data++;
}
};
int main()
{
int DataSize = 19;
PChar *arr = new PChar[DataSize];
FillString(arr, DataSize);
for (int idx = 0; idx < DataSize; ++idx)
{
delete[] arr[idx];
}
delete[] arr;
}
S>>>как правильно осободить память для каждого элемента массива arr?
__>>Правильное решение пользоваться std::vector вместо динамического массива. __>>Он заботится об освобождении памяти сам. __>>И тогда такие вопросы отпадут сами
S>Нет, меня не интерсует на данный момент std::vector, как им пользоваться я знаю. S>Я пять лет не садился за C++ и мне нужно вспомнить как правильно работать с указателями.
Вот :
char** pp;
const size_t count = 10;
const size_t inner_count = 10;
pp = new char*[count];
for(size_t i = 0; i != count; ++i)
pp[i] = new char[inner_count];
// работаем
// удалениеfor(size_t i = 0; i != count; ++i)
delete[] pp[i];
delete pp[i];
Здравствуйте, VoidEx, Вы писали:
VE>Здравствуйте, _nn_, Вы писали:
__>>P.S. __>>На мой взгляд если в коде есть ручной вызов delete это плохой код.
VE>А как же тогда написать smart_ptr ? VE>
Я имел ввиду что следует пользоваться обертками.
Естественно где-то будет ручной вызов delete, но он будет только на самом нижнем уровне, а в коде программы его не будет видно