Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2012, 01:34   #31
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну тогда да, все верно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.12.2012, 05:15   #32
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

delete сам вызывает деструктор удаляемого объекта, так что будет бесконечная рекурсия.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 14.12.2012, 09:35   #33
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Может я не правильно понимаю синтаксис с++? Но как я понимаю this, это указатель на объект. Так вот нам и надо освободить память по этому адресу.
Цитата:
существования this не значит что память освобождаемая.
Но как вы говорите выходит все не так просто.

Я это к тому-что, если в программе объекты будут создаватся только динамически. Можно-ли написать такой класс, чтобы сам освобождал память от своих объектов?
SAMOUCHKA вне форума Ответить с цитированием
Старый 14.12.2012, 10:09   #34
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

smart ptr всякие например.
да и метод посерил-подтер вполне достаточен.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.12.2012, 10:18   #35
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
Можно-ли написать такой класс, чтобы сам освобождал память от своих объектов?
Можно. Вопрос в одном - в какой момент времени это делать?
waleri на форуме Ответить с цитированием
Старый 14.12.2012, 10:51   #36
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
Может я не правильно понимаю синтаксис с++? Но как я понимаю this, это указатель на объект. Так вот нам и надо освободить память по этому адресу.
Пример:

Код:
int main()
{
    Some obj; //создан на стеке. Его this нельзя прибивать
}

Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
Я это к тому-что, если в программе объекты будут создаватся только динамически. Можно-ли написать такой класс, чтобы сам освобождал память от своих объектов?
Пример:

Код:
int main()
{
    Some* ptr = new Some(); //создан в динамической памяти
}
Здесь у тебя были созданы сразу две сущности:
1. Собственно объект в динамической памяти.
2. Указатель на этот объект на стеке (локальный).

Ну так вот, когда закончится область видимости указателя, то он сдохнет.
У этого указателя нет диструктора, который запустит delete объекту, на который он смотрит. Поэтому, когда указатель помрет, объект так и останется в куче.

Если ты сделаешь вот так:

Код:
int main()
{
    Some* ptr = new Some(); //создан в динамической памяти
    ptr-> ~Some(); //запуск дисктрутора объекта
}
То у объекта запустится его диструктор. Теоретически, диструктор вполне реально написать так, что бы объект пригрохал самого себя.

Однако: это будет то, что ещё называют: "на первый этаж через чердак".
Кроме того, подобные выкрутасы не имеют никаких приимуществ по сравнению со стандартным:

Код:
int main()
{
    Some* ptr = new Some(); //создан в динамической памяти

    delete ptr;  //вот такую запись сможет понять любой программист
}
В обоих случаях, тебе придется ручками запускать функцию. В первом случае - диструктор объекта. А во втором - оператор delete.

Только во втором случае запись проще, понятнее, привычнее.

А первый случай - это тернистая дорожка, которая в итоге опять таки вызовет delete
Ну и смысл тогда?
_Bers вне форума Ответить с цитированием
Старый 14.12.2012, 10:55   #37
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Может я не правильно понимаю синтаксис с++? Но как я понимаю this, это указатель на объект. Так вот нам и надо освободить память по этому адресу.
Надо. Только это обычно не компетенция объекта - решать, пора ему умирать или нет.
Цитата:
Можно-ли написать такой класс, чтобы сам освобождал память от своих объектов?
Теоретически можно. Практически - почти наверняка бессмысленно. Класс - это такой чёрный ящик, который "дёргают" снаружи, вызывая его методы - и только в эти моменты код класса получает управление. Внимание, вопрос: как мы, в классе, должны понять, что вот по завершении этого метода нам пора дохнуть? Или этот метод вызывается тогда и только тогда, когда нам пора дохнуть (и тогда его код можно перенести в деструктор, а вызывающему коду вместо вызова этого метода посоветовать делать delete), или у нас в классе есть методы, по завершении вызова которых объект то ли будет существовать, то ли нет, что лично я никак не могу назвать безопасной практикой.
Abstraction вне форума Ответить с цитированием
Старый 14.12.2012, 17:21   #38
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

он наоборот крякнуть хочет.
но только он не так это мыслит... мало инфы по этому вопросу.
а тут ему не дадут знаний.
А объект сам должен заниматься своими делами... и лишь мы как начальник, решаем уволить или он ещё нужен, а может вместо него нам ещё кого то.. объект сам не может это решать. ну если только сообщит о своём намериньи и только. а в его случаи это не логично и нет даже в жизни. поэтому это приведёт только к аварийному завершению проги.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 14.12.2012, 17:29   #39
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
он наоборот крякнуть хочет.
Ну, по заглавному посту совет простой: Солдатова в руки и написать что-нибудь из серии "никогда так не делайте", типа обращения к страничной памяти на IRQL>1 - будет ему синий экран.
Abstraction вне форума Ответить с цитированием
Старый 28.12.2012, 11:40   #40
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Ну, по заглавному посту совет простой: Солдатова в руки и написать что-нибудь из серии "никогда так не делайте", типа обращения к страничной памяти на IRQL>1 - будет ему синий экран.
Я уже писал, выше, "я не хочу писать кривые программы".

Цитата:
Цитата:
Сообщение от SAMOUCHKA
Можно-ли написать такой класс, чтобы сам освобождал память от своих объектов?
Можно. Вопрос в одном - в какой момент времени это делать?
Код:
void func()
{
myClass *o1 = new myClass() // создаем объект
//..
} // все, тут объект больше не нужен
Я это к тому, что не надо будет держать в голове, освободил память или нет.
SAMOUCHKA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Безопасность e_e_n Безопасность, Шифрование 40 03.09.2010 01:11
Безопасность x_AN777 Помощь студентам 2 08.05.2010 23:30
Безопасность xap4o PHP 4 15.02.2010 00:02