Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление указателей. Хм..Второй день не сплю.. 
:(
    Опции темы
Coocky
Дата 18.7.2005, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Ну учился как все, если есть new значит и делит..
Но часто встречал такой вариант

Код

CWnd *p=GetDlgItem(MY_ITEM);
///
.....
////Че-то делаем
.....
if (p!=NULL)


{
 delete p;

}



ну и..
что скажете...?
Память не выделяли,а указатель удаляем. вообще, правильно , вернее нужно ли так?
Пардон, что на МФС, но надеюсь всем понятно.. smile

Это сообщение отредактировал(а) Coocky - 18.7.2005, 22:03


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Domestic Cat
Дата 18.7.2005, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Вообще говорят что им лучше не пользоваться smile

http://www.flounder.com/getdlgitem.htm




--------------------

PM   Вверх
Coocky
Дата 18.7.2005, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Domestic Cat
Привет старина, вот уж кого не ожидал увидеть.. smile
Недаром я подозревал smile
Так сылочка у меня молчит...
И чем лучше не пользоваться..?

Это сообщение отредактировал(а) Coocky - 18.7.2005, 22:10


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Domestic Cat
Дата 18.7.2005, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Там про GetDlgItem smile Но ссылка работает, проверил только что.


--------------------

PM   Вверх
Coocky
Дата 18.7.2005, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



А все , работает.
Но я не за GetDlgItem() smile
Код

CHttpFile* pFile=(CHttpFile*)OpenURL(......);

///Че-то опять пишем, возможно даже и работает :) 

if (pFile!=NULL)


{
 delete pFile;

}



Можно и так , суть не в этом...
Почему иногда удаляют( иногда я вижу)
указатели на которые не выделялась память..?

Это сообщение отредактировал(а) Coocky - 18.7.2005, 22:15


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Domestic Cat
Дата 18.7.2005, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Погоди, но ведь метод OpenURL возвращает указатель, а указатель может быть только на область памяти. Следовательно, память все-таки была выделена.


--------------------

PM   Вверх
Coocky
Дата 18.7.2005, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Domestic Cat
Ладно, smile
Ну а другие методы..
Код



int s=10;

int *p=& s;
 


тут надо удалять? smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Domestic Cat
Дата 18.7.2005, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Удалять нужно только то, что создано через new, то есть на хипе. А в твоем примере переменная существует на стеке, потому память будет освобождена автоматически по завершению метода.


--------------------

PM   Вверх
Coocky
Дата 18.7.2005, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Domestic Cat
Правильно, но тогда...
Указатель же можно вернуть таким же образом?
Код

int * MyFunc (....)

{
int s=10;
int *p=&s;
return p;


}


Просто вопрос в другом, я то же всегда( как выше описано) удалял при явном выделении памяти..
Но в книгах иногда видел и удаление и неудаление без явного выделения памяти..
Мне -то что делать?
Как жить? smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Domestic Cat
Дата 18.7.2005, 22:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Цитата(Coocky @ 18.7.2005, 13:41)
int * MyFunc (....)
{
int s=10;
int *p=&s;
return p;

Насколько я помню, ничего хорошего при этом не выйдет smile

Цитата(Coocky @ 18.7.2005, 13:41)
Мне -то что делать?
Как жить? smile

Так, чтобы не было мучительно больно за бесцельно прожитую жизнь (с) smile


--------------------

PM   Вверх
Coocky
Дата 18.7.2005, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



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


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Domestic Cat
Дата 18.7.2005, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Удаляй, хуже не будет...


--------------------

PM   Вверх
Coocky
Дата 18.7.2005, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Domestic Cat
А иногда и в дебаг вылетаю....
Не могу понять когда да ,и когда нет.
Если это нужно делать, то буду(хотя мароки будет.........) у нас же все через указатели..
Добавлено @ 22:53
Классический код С++ я учил давно, но не помню про delete без выделения памяти..


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Domestic Cat
Дата 18.7.2005, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Все что говорим мсдн:
Цитата
The delete operator deallocates a block of memory. The pointer argument must refer to a block of memory previously allocated for an object created with the new operator.


Если тебе возвращают указатель, значит память была выделена на хипе по-любому, значит нужно удалять.



--------------------

PM   Вверх
Любитель
Дата 18.7.2005, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(Domestic @ 18.7.2005, 22:54)
Если тебе возвращают указатель, значит память была выделена на хипе по-любому, значит нужно удалять.

Может быть и не выделена, может использовались скажем параметры, преданные функции. А так надо удалять если знаешь, что возвращается указатель на память, выделенную внутри функции.


--------------------
PM MAIL ICQ Skype   Вверх
S.A.P.
Дата 19.7.2005, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Любитель
Цитата
Может быть и не выделена, может использовались скажем параметры, преданные функции.
это как? smile функция вернула параметр, который ей передавался? smile .


Цитата(Coocky @ 18.7.2005, 22:14)
CHttpFile* pFile=(CHttpFile*)OpenURL(......);

Тут удалять ничего не надо smile , а вместо этого вызывать
Код

pFile->Close();

метод Close() у тебя должен вызываться и для CInternetSession.
PM MAIL   Вверх
Любитель
Дата 19.7.2005, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(Perchilla @ 19.7.2005, 01:14)
Тут удалять ничего не надо

И почему это не надо. Вот Close - сам вызовется (при удалении), а память, выделенную на объект освободить?


--------------------
PM MAIL ICQ Skype   Вверх
Mayk
Дата 19.7.2005, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Цитата(Coocky @ 18.7.2005, 23:50)
у нас же все через указатели.

Ссылки тоже рулят.


Кстати, а мне непонятен смысл проверки на NULL:
Код

if (pFile!=NULL)
 delete pFile;

Delete плюсов, ровно как и free Си, не должен делать что-либо, если переданный указатель NULL. Смотрите:
Код

class Test{
  public:
  ~Test(){printf("Hello from destructor\n");}
};
int main()
{
    Test* t1 = new Test;
    Test* t2 = NULL;
    delete t1; //<-- деструктор вызывается
    delete t2; //<-- дважды удаляем NULL, деструктор НЕ вызывается
    delete t2;
    printf("printf was here.\n"); //<-- убедимся, что прога не упала
    delete t1; // <-- удаляем указатель во второй раз. В режиме отладки точно упадёт.
    printf("2)printf was here.\n"); //<-- убедимся, что прога упала
}


Неужели это делается только для того, чтобы не вызывать операторы delete?



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Coocky
Дата 19.7.2005, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Так, забыли мои фугкции Это я к примеру, и так вопрос-УДАЛЯТЬ или НЕ удалять все указатели...
Если !=NULL?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Mayk
Дата 19.7.2005, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Coocky
Читать документацию. Если сказано удалять - удаляй. Если нет - то даже не пытайся.
Некоторый ф-ции(например, в ANSI C readdir) возвращают указатели на статические переменные. Если попробуешь удалить, то будет ой. А с NULLом при удалении ИМХО сравнивать не стоит. Разве ты часто operator delete перегружаешь?


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Earnest
Дата 19.7.2005, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Domestic @ 18.7.2005, 22:54)
Если тебе возвращают указатель, значит память была выделена на хипе по-любому, значит нужно удалять

Ну ты сказал! Как будто указатели, кроме хипа, никуда больше не могут указывать.
Наоборот, никогда не надо освобождать указатель, не тобою выделенный, за исключением случаев, когда в описании процедуры прямо сказано, что за освобождение памяти отвечает вызывающий код. Что касается CWnd::GetDlgItem - точно не надо ничего освобождать. Эта функция может вернуть как указатель на временный динамический объект, так и на где-то лежащую переменную. В первом случае MFC сам почистит память, во-втором - понятно, что удалять ни в коем случае нельзя.
Упс! Не заметила большого продолжения. Вобщем, Mayk, все то же самое уже сказал.

Это сообщение отредактировал(а) Earnest - 19.7.2005, 18:00


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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Цитата(Earnest @ 19.7.2005, 08:56)

Ну ты сказал! Как будто указатели, кроме хипа, никуда больше не могут указывать.

А какой смысл возвращать указатель на стек?


--------------------

PM   Вверх
Mayk
Дата 20.7.2005, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Цитата(Domestic @ 20.7.2005, 02:11)
А какой смысл возвращать указатель на стек?

Хотя бы для удобства.
Допустим нам быстро надо скопировать две строки в третью. При возвращении указателей это делается в одну строчку.
Код

char* part1 = "Hello ";
char* part2 = "world";
char helloworld[50];
strcat(strcpy(helloworld, part1), part2);

Очень удобно.
(после небольшой тренировки этот код вызывает не больше проблем чтения, чем while(*i++=*j++)).
Кроме того, указатель может указывать так же и на статические переменные.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Earnest
Дата 20.7.2005, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Domestic @ 20.7.2005, 01:11)
А какой смысл возвращать указатель на стек?

Функция может возвращать указатель на статическую/глобальную переменную - напр., AfxGetMainWnd().
Функция-член класса может возвращать указатель на что-нибудь внутри объекта...
Да мало ли...




--------------------
...
PM   Вверх
Mayk
Дата 22.7.2005, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Еще вспомнил такую функция, как alloca() - выделение памяти в стеке. Правда она не очень распространена, но всё же. При выходе из функции память автоматически освобождается. Этакий auto_ptr со времён си. Разумеется, удалить выделенный таким образом объект практически невозможно иначе как выйти из функции.



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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