Как правильно освободить память
От: sps608  
Дата: 03.12.05 10:28
Оценка:
Есть следующий код


typedef char* PChar;

void FillString(PChar *data, int DataSize){

    for (int i = 0; i < DataSize; i++)
    {
        ...
        *data = new char[z];
        ...
        data++;
    }
};

...
PChar *arr = new PChar[DataSize]
FillString(arr, DataSize);
...


как правильно осободить память для каждого элемента массива arr?
Re: Как правильно освободить память
От: _nn_ www.nemerleweb.com
Дата: 03.12.05 10:34
Оценка:
Здравствуйте, sps608, Вы писали:

S>Есть следующий код



S>
S>typedef char* PChar;

S>void FillString(PChar *data, int DataSize){

S>    for (int i = 0; i < DataSize; i++)
S>    {
S>        ...
S>        *data = new char[z];
S>        ...
S>        data++;
S>    }
S>};

S>...
S>PChar *arr = new PChar[DataSize]
S>FillString(arr, DataSize);
S>...
S>


S>как правильно осободить память для каждого элемента массива arr?


Правильное решение пользоваться std::vector вместо динамического массива.
Он заботится об освобождении памяти сам.
И тогда такие вопросы отпадут сами

P.S.
На мой взгляд если в коде есть ручной вызов delete это плохой код.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Как правильно освободить память
От: Greg Zubankov СССР  
Дата: 03.12.05 10:39
Оценка:
Здравствуйте, sps608, Вы писали:

S>как правильно осободить память для каждого элемента массива arr?

В обратном порядке:

  for (int idx = 0; idx < DataSize; ++idx)
  {
    delete[] arr[idx];
  }
  delete[] arr;
Re[2]: Как правильно освободить память
От: sps608  
Дата: 03.12.05 10:40
Оценка:
S>>как правильно осободить память для каждого элемента массива arr?

__>Правильное решение пользоваться std::vector вместо динамического массива.

__>Он заботится об освобождении памяти сам.
__>И тогда такие вопросы отпадут сами

Нет, меня не интерсует на данный момент std::vector, как им пользоваться я знаю.
Я пять лет не садился за C++ и мне нужно вспомнить как правильно работать с указателями.
Re[2]: Как правильно освободить память
От: sps608  
Дата: 03.12.05 10:49
Оценка:
Здравствуйте, Greg Zubankov, Вы писали:

GZ>Здравствуйте, sps608, Вы писали:


S>>как правильно осободить память для каждого элемента массива arr?

GZ>В обратном порядке:

GZ>
GZ>  for (int idx = 0; idx < DataSize; ++idx)
GZ>  {
GZ>    delete[] arr[idx];
GZ>  }
GZ>  delete[] arr;
GZ>


Получаю ошибку: "Heap corruption detected: after Normal block #212 at .... CRT detected that te apllication wrote to memoryafter end of heap buffer"
Re: Как правильно освободить память
От: sps608  
Дата: 03.12.05 10:52
Оценка:
если сделать так:


    for (int i = 0; i < DataSize; ++i)
    {
        delete[] arr;
        arr++;
    }


то после превого цикла получаю, что arr bad pointer...
Re[2]: Как правильно освободить память
От: Greg Zubankov СССР  
Дата: 03.12.05 11:03
Оценка:
Здравствуйте, 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 указывает после этого указывает в никуда
Re[3]: Как правильно освободить память
От: Greg Zubankov СССР  
Дата: 03.12.05 11:04
Оценка:
Здравствуйте, 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;
}
Re[3]: Как правильно освободить память
От: _nn_ www.nemerleweb.com
Дата: 03.12.05 11:09
Оценка:
Здравствуйте, sps608, Вы писали:


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];



P.S.
Но в хорошей программе такое писать низачто
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Как правильно освободить память
От: Кодт Россия  
Дата: 03.12.05 14:26
Оценка: +1
Здравствуйте, _nn_, Вы писали:

__>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   ;
//        ~~   ~~~


Ну и конечно же, этот код совершенно не устойчив перед исключениями bad_alloc.
Перекуём баги на фичи!
Re[2]: Как правильно освободить память
От: VoidEx  
Дата: 03.12.05 17:25
Оценка:
Здравствуйте, _nn_, Вы писали:

__>P.S.

__>На мой взгляд если в коде есть ручной вызов delete это плохой код.

А как же тогда написать smart_ptr ?
Re[3]: Как правильно освободить память
От: _nn_ www.nemerleweb.com
Дата: 03.12.05 17:29
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, _nn_, Вы писали:


__>>P.S.

__>>На мой взгляд если в коде есть ручной вызов delete это плохой код.

VE>А как же тогда написать smart_ptr ?

VE>

Я имел ввиду что следует пользоваться обертками.
Естественно где-то будет ручной вызов delete, но он будет только на самом нижнем уровне, а в коде программы его не будет видно
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.