Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Memory leaks, С и С++ при работе с памятью 
:(
    Опции темы
Fantasist
Дата 14.1.2003, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Удалено модератором


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Vit
Дата 14.1.2003, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Модератор: Пожалуйста, давайте обсуждать ООП в обоих смыслах во флейме, а целесообразность програмных технологий, если уж тах хочется, то отдельным топиком.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
brb
Дата 14.1.2003, 03:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



С интересом бы прочитал этот коментарий! То, что взгляды не совпадают, явление нормальное, да и шутить тоже не грех, причем, на любую тему!
--------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети.
PM MAIL   Вверх
brb
  Дата 27.1.2003, 03:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



Все замолчали на эту тему, а, по-моему, она не закрыта! Добавлю еще ряд подвопросов.
class PState{}
PState * ps[1200]; // статически выделенная память
for(i = 0; i <1200;i++)ps[i] = new PState ();
/*заполняем предыдущий статический массив динамически*/
/*
какой-то дурацкий код...
*/
delete [ ] ps;
/* похоже, что этот оператор освободит КАЖДЫЙ динамически выделенный элемент массива*/

// Теперь то же, но по-другому

PState **pps = new PState *[1200];
/*кстати, не понятно почему
PState *pps[ ] = new PState *[1200];
выдает ошибку - это же одно и то же!!!*/

for(i = 0; i <1200;i++)pрs[i] = new PState ();
/*заполняем динамический массив динамически*/
/*
еще какой-то дурацкий код...
*/
delete [ ] pps;
/*А что удаляет этот оператор? Массив указателей или и все что внутри тоже?
А может правильно делать так:
for(i = 0; i <1200;i++)delete pрs[i];
delete [ ] pps:
*/

Господа, пожалуйста, делитесь ОПЫТОМ и КОДОМ, а не соображениями.

Спасибо.
--------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети.
PM MAIL   Вверх
Fantasist
Дата 29.1.2003, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
Все замолчали на эту тему, а, по-моему, она не закрыта


Чем же это она не закрыта? На все предыдущие вопросы ответы были данны.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Fantasist
Дата 29.1.2003, 06:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
class PState{}
PState * ps[1200]; // статически выделенная память
for(i = 0; i <1200;i++)ps[i] = new PState ();
/*заполняем предыдущий статический массив динамически*/
/*
какой-то дурацкий код...
*/
delete [ ] ps;
/* похоже, что этот оператор освободит КАЖДЫЙ динамически выделенный элемент массива*/


НЕЛЬЗЯ так делать! Я уже об этом говорил. delete[] применим ТОЛЬКО к указателям, для которых память была выделенна с помощью new[] . То, что на вашем компиляторе это может быть работает не означает, что так можно. Если в цикле выделяете, то и в цикле и освобождайте. То есть либо так:

Код

PState * ps[1200]; // статически выделенная память
for(i = 0; i <1200;i++)ps[i] = new PState ();
......
for(i = 0; i <1200;i++) delete ps[i];



либо так:

Код

PState * ps=new PState[1200]; // статически выделенная память
.......
delete [] ps;



Цитата
PState **pps = new PState *[1200];
/*кстати, не понятно почему
PState *pps[ ] = new PState *[1200];
выдает ошибку - это же одно и то же!!!*/


Ничего это не одно и то же, если вы пишите на С++. На мой взгляд, это извращение высшего порядка - в С++ классы есть. А тип PState *[] это не то же самое, что PState **, а то, что они оба реализуются как указатель на указатель, не делают их одним и тем же типом. Это в Java вы можете писать:

Сpd pd[];
pd=new Cpd[10];

В С++ это не так.

Цитата

А может правильно делать так:
for(i = 0; i <1200;i++)delete pрs[i];
delete [ ] pps;


Да. delete[] удаляет массив из нескольких элементов и для каждого из них вызывается деструктор, если тип нетривиальный. В данном случае - это массив указателей - тип тривиальный. Строчкой

delete [ ] pps;

массив указателей будет удален. Объекты, на которые эти указатели указывали никто удалять за вас не будет.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Guest
Дата 29.1.2003, 07:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Уважаемый, Fantasist

С этого все начиналось...

PayState *ptr; // класс поинтер вестимо
PayState *pPayState[1200];

for (i = 0; pPayState[i] != NULL; i++ )delete pPayState[i];
// я думал, что тут я освобождаю всю занятую память
i = 0;
do {
ptr = new PayState ( bc, ic ); // конструктор - аллокирует новую запись
if ( ptr != NULL ){ // успешно
// какой-то дурацкий код...
pPayState[i++] = ptr; //Поместить в массив для дальнейших нужд
}
else {
ShowMessage ("Not enough memory, Sorry");
exit ( EXIT_FAILURE );
}
} while ( ); // больше записей нет!

Я начал эту тему потому что НЕ работало.
Скопированное из хэлпа
delete[ ] pPayState;
прекрасно освобождало память. Это и послужило отправной точкой дискуссии.
Ответа на почему не работало не нашлось, хотя гипотезы и предположения были. Обратите внимание, в НЕработающем коде я делал именно так, как вы настаиваете и я изначально делал.
Цитата
НЕЛЬЗЯ так делать! Я уже об этом говорил. delete[] применим ТОЛЬКО к указателям, для которых память была выделенна с помощью new[] . То, что на вашем компиляторе это может быть работает не означает, что так можно. Если в цикле выделяете, то и в цикле и освобождайте


Согласен, что некрасиво, но почему то что красиво не согласно со мной?
Код

PState **pps = new PState *[1200];
/*кстати, не понятно почему
PState *pps[ ] = new PState *[1200];
выдает ошибку - это же одно и то же!!!*/


Цитата

Ничего это не одно и то же, если вы пишите на С++. На мой взгляд, это извращение высшего порядка - в С++ классы есть. А тип PState *[] это не то же самое, что PState **, а то, что они оба реализуются как указатель на указатель, не делают их одним и тем же типом. Это в Java вы можете писать:

Сpd pd[];
pd=new Cpd[10];

В С++ это не так.


Мы о Джаве не говорим.
А вот
void main(int argc, char *argv[ ]){...}
void main(int argc, char **argv ){...}
Это что не C++? Или что-то из этого не? Или это не одно и тоже?
Не буду утверждать безаппеляционно, как некоторые, но замечу, что по определению [ ](массив) это *(указатель), и если есть
Код

char a[10];
char *p;
p = a; // абсолютно корректно, а  *( p + 5), например,  тоже самое что и a[5]

И причем тут классы? В С++ много чего есть! И при чем тут извращения?
Где сказано, что в ++ указатель на массив какого-либо типа и указатель на указатель того же типа, не одно и тоже? Единственный довод в Вашу пользу, что компилятор выдает ошибку, но это не самый сильный довод.

Цитата

Да. delete[] удаляет массив из нескольких элементов и для каждого из них вызывается деструктор, если тип нетривиальный. В данном случае - это массив указателей - тип тривиальный. Строчкой

delete [ ] pps;

массив указателей будет удален. Объекты, на которые эти указатели указывали никто удалять за вас не будет.


Похоже, что и это не так. Посмотрите опять на самое начало.

И давайте аргументировать, а не бросаться формулами.

С уважением,
BRB
  Вверх
Fantasist
Дата 31.1.2003, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
Я начал эту тему потому что НЕ работало.
Скопированное из хэлпа
delete[ ] pPayState;
прекрасно освобождало память


Слушайте, а чем вы компилируете? ? ?

Вот код:
Код

              CClass *pClass[1200];

for (int i=0; i<1200; ++i) {pClass[i]=new CClass(i);};

delete[] pClass;



Компилируем VS60. На последнюю строчку получаем:

Цитата
warning C4154: deletion of an array expression; conversion to pointer supplied


При исполнении все грохается на последней строчке, как и следовало ожидать. И это законно - освобождение стековой переменной.

Цитата
Согласен, что некрасиво, но почему то что красиво не согласно со мной?


Ну сколько можно! Это не не красиво, это НЕ ПРАВИЛЬНО по СТАНДАРТУ!

Цитата
но замечу, что по определению [ ](массив) это *(указатель), и если есть


Никогда такого опеределения не было. Поймите, С++ - это не С. Это разные языки, хоть и похожи.
В С++ вы неможете написать:

char p[]=new char[100];

Не можете, и все. Это СТАНДАРТ языка. ТО ЧТО МАССИВ(в реализации) ЯВЛЯЕТСЯ УКАЗАТЕЛЕМ НЕ МЕНЯЕТ ПОЛОЖЕНИЯ.

Удалено модератором


--------------------
Волны гасят ветер...
PM MAIL   Вверх
brb
Дата 31.1.2003, 04:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



Fantasist
Цитата

Слушайте, а чем вы компилируете? ? ?

Билдером. Был первый, сейчас обзавелся 6-м
Цитата

Компилируем VS60. На последнюю строчку получаем:

Может VC6?
Цитата

Никогда такого опеределения не было. Поймите, С++ - это не С. Это разные языки, хоть и похожи.

C++ это надмножество С. Не верите? Спросите у Страуструпа(фамилию, наверняка, переврал, но все равно узнаваемо), он ++ сочинил!
Цитата

В С++ вы неможете написать:
char p[]=new char[100];

Во-первых, частица НЕ с глаголами пишется раздельно, по крайней мере, на русском языке!
А, во-вторых, хотел бы узнать не то, что это ошибка /* Cannot convert 'char *' to 'char[]'*/, а почему это так!
Цитата

При исполнении все грохается на последней строчке, как и следовало ожидать. И это законно - освобождение стековой переменной.

Массив указателей был объявлен СТАТИЧЕСКИ! Может это причина? Почему же, все-таки первый вариант(внутри цикла до NULL) не работал? И мы именно с Вами это уже обсуждали!
Цитата

for (i = 0; pPayState[i] != NULL; i++ ){
  delete pPayState[i];
  pPayState[i] = NULL;
}
Странно, только, что 3-4 прохода, а это полный размер pPayState[]. Вот если бы вылетало на втором...

Последнее замечание оставленно Вами без ответа.
Тем не менее, от добра добра не ищут, и я оставил все как есть, потому что нет проблем!
Удалено модератором
--------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети.
PM MAIL   Вверх
Unregistered
Дата 31.1.2003, 06:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Удалено модератором
  Вверх
brb
Дата 31.1.2003, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



Удалено модератором
--------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети.
PM MAIL   Вверх
Fantasist
Дата 31.1.2003, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Удалено модератором

Цитата
А, во-вторых, хотел бы узнать не то, что это ошибка /* Cannot convert 'char *' to 'char[]'*/, а почему это так!


Вот %^&$!! ДА ПОТОМУ ЧТО ЭТО РАЗНЫЕ ТИПЫ ОПРЕДЕЛЕННЫ СТАНТДАРТОМ ЯЗЫКА Mассив - это статический (причем с фиксированным размером!) кусок памяти и все тут. Исключения составляют формальные аргументы функций.

Удалено модератором


--------------------
Волны гасят ветер...
PM MAIL   Вверх
brb
Дата 31.1.2003, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



Удалено модератором
--------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети.
PM MAIL   Вверх
Vit
Дата 31.1.2003, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Модератор: ещё не забыли о чём спрашивалось в теме? Напоминаю -

Цитата
объясните в чем дело? Я и синтаксиса такого не знаю: delete[] pPayState;


2 brb: если на вопрос отвечено, то я тему закрываю, если нет, то спрашивайте по существу чтО именно не понятно.

2 Fantasist: Давайте без перехода на личности


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 31.1.2003, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Удалено модератором


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.