![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
К примеру:
Такой такой код корректен? Сколько раз в данном случае отрабатывает delete? -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| witex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 16.10.2006 Где: Эстония Репутация: 0 Всего: 4 |
1 раз будет всего смполняться!
Только этот
чтобы удалить "х", надо вызывать деструктор! ->~SomeClass(); но чтобы праильно "х" удалалить , надо испольщовать delete[] а не delete --------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
всё правильно.... delete pSomeClass вызовет деструктор класса pSomeClass в котором в свою очередь вызовется delete x
Это сообщение отредактировал(а) Partizan - 10.12.2006, 11:49 -------------------- СУВ, Partizan. |
|||
|
||||
| VectorMan |
|
|||
|
Antihero ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 9.4.2006 Репутация: 1 Всего: 4 |
witex, уверен?
Вообще то конструкции типа
означают "динамически создать элемент типа int и присвоить ему значение 10" |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
deleted
Это сообщение отредактировал(а) archimed7592 - 10.12.2006, 12:36 -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Daevaorn, да я страничку обновить забыл...тут уже все что нужно ответили
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
=)) к стыду своему я тоже попался )))
-------------------- СУВ, Partizan. |
|||
|
||||
| WERITAS |
|
|||
|
******** ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 2.5.2005 Где: Москва Репутация: нет Всего: 5 |
Rockie,
Это тема-развод?
Код корректный, delete очищает одну переменную, созданную динамически, как уже было отмеченно выше. -------------------- Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак" |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Провакация
|
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
и не думал В данном примере delete очищает память и вызывает деструктор, в котором в свою очередь очищается память?.. Если delete будет вызыван дважды(для объекта и для переменной x), то отработает ли он по участку памяти, уже очищенной в ~SomeClass(){delete x; }. -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
гмм....у ты думаешь после первого delete pSomeClass всё ещё будет указывать на ту же область памяти?
сомневаюсь) ооочень сомневаюсь) -------------------- СУВ, Partizan. |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| zabivator |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 7.6.2006 Где: нск Репутация: 1 Всего: 2 |
Rockie, после отработки деструктора класса вызываются сначала деструкторы его мемберов, затем - базовых классов, соответственно в твоем случае удалятся указатель на память, а память удалять нужно руками - поэтому мы в деструкторе пишем delete x
--------------------
#include <zabivator>int main( int, char * [] ){ while( Zabivator::жив() ) Zabivator::моск()++; return 0;} |
|||
|
||||
| Rockie |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
Partizan, imho в этом случае при выходе из ф-ии main() вызовется деструктор, в котором очистится память:
А в случае
delete вызывает деструктор и освобождает память, выделенную под объект. А если в деструкторе уже освобождается память? вот что хотелось бы узнать.. Daevaorn, я плохо понимаю ваши посты. Что конкретно не устраивает, порядок слов
? Судя по всему вы много чего понимаете, но только ничего не скажете.. Ваш пост неинформативен. Хорошо я понимаю теорию, плохо ли - это оффтоп и никого не интересует, вы попросту нафлудили. Это сообщение отредактировал(а) Rockie - 10.12.2006, 20:57 -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||||||
|
|||||||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
порядок действий. сначала деструктор
потом удаляет -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| zabivator |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 7.6.2006 Где: нск Репутация: 1 Всего: 2 |
Rockie, повторяю еще раз: деструктор НЕ освобождает память, выделяемую динамически, либо переданную в класс извне ( через указатели/ссылки). Единственное, что уничтожается после вызова деструктора ( при достижении конца области видимости - для автоматических переменных, при вызове delete - для элементов выделенных при помощи new ) - это ЧЛЕНЫ класса - в твоем случае это УКАЗАТЕЛЬ, а никак не память, на которую он указывает.
--------------------
#include <zabivator>int main( int, char * [] ){ while( Zabivator::жив() ) Zabivator::моск()++; return 0;} |
|||
|
||||
| Daevaorn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
А Вы попросту нагадили Да.
да
Там освобождается память не связанная с предыдущей. Там память на которую указывает указатель-член класса. |
||||
|
|||||
| Rockie |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
это понятно, было бы странно, если бы было наоборот. Надо было мне точнее выражать свои мысли и не давать повода =)
ну это я тоже понимаю Partizan, за минус конечно спасибо.. Вообще мой вопрос касается расположения объекта в памяти. То есть объект располагается так: _______ ____ | | | | | obj | | x | | | |___| | | | | |______| либо так: _______ | | | obj | | | | | | x | |______| ? Если так, как во втором случае - то получается что память, выделенная под x удаляется дважды либо нет? Вот о чем я спрашивал. -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||
|
|||||
| zabivator |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 7.6.2006 Где: нск Репутация: 1 Всего: 2 |
Rockie, нет,дважды она не удаляется. Я чувствую, ты просто не понимаешь, что указатель - это не память, на которую он указывает. На одну и ту же память ссылаться может куча указателей. Суть не в этом. Память выделенная при помощи new, должна освобождаться при помощи delete. В классе у тебя не память лежит, а лшь указатель на нее. ПО этому указателю, раз уж ты в конструкторе вызвал new, нужно вызвать delete. Еще раз: указатель - отдельный объект, в котором хранится адрес выделеной тобою памяти. Автомтически удалится указатель, т.е. адрес. Но память-то никуда не денется. Ее руками чистить надо.
--------------------
#include <zabivator>int main( int, char * [] ){ while( Zabivator::жив() ) Zabivator::моск()++; return 0;} |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
zabivator, я тоже понимаю разницу между указателем и выделенной под него памятью, а также что такое new, delete, конструктор, int, main()..
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| zabivator |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 7.6.2006 Где: нск Репутация: 1 Всего: 2 |
Rockie, тогда откуда такие странные вопросы? Почему тебе кажется, что она могла удалиться второй раз?
--------------------
#include <zabivator>int main( int, char * [] ){ while( Zabivator::жив() ) Zabivator::моск()++; return 0;} |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Rockie, вот какая ситуация
delete obj делает две вещи: 1. вызывает деструктор. деструктор удаляет *x т. е. освобождает выделеную в конструкторе память. 2. удаляет выделенную под объект память. эта память выделенная под указатель x. не под объект на который указывает x. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
archimed7592, да, и об этом же, начиная с первого поста. Так вот предположим, что у нас есть сложный объект, который содержит данные. Для некоторых элементов в нем память выделяется динамически, как int* x = new int(10); Для наглядности можно добавить какие-нибудь другие данные, любые, к примеру int y, z; // и тд. Объект класса тоже создаем динамический: SomeClass* pSomeClass = new SomeClass; Насколько я понимаю, delete знает где находится объект и размер объекта. Имея эту информацию можно освободить память, занимаемую объектом. Так вот возможна ли ситуация, что объект в памяти расположится таким образом: *obj --------------- | int *x | | | | ---- | | | x | | | ---- | | | | int y | | int z | | int* f | | | ---------------- В деструкторе освободится память, выделенная под int* x; а затем будет освобождена память, выделенная под сам объект. Тогда получается, что участок памяти ---- | x | ---- очищается дважды. Либо такая ситуация невозможна и объекта класса будет обязательно размещен в памяти отдельно от объекта x. Я спрашивал об этом, а не об основах C++ и уж тем паче не собирался получать за это минусы =) Это сообщение отредактировал(а) Rockie - 11.12.2006, 01:56 -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| zabivator |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 7.6.2006 Где: нск Репутация: 1 Всего: 2 |
Rockie, ни разу неправильно. Память, выделенная при помощи new int распологается не после указателя, а где придется ( там, где ее new разместит ). Сначала память выделится под все члены класса, а потом уже начнет работать конструктор. Т.е. память выделенная new int не может оказаться между указателем и остальными мемберами.
--------------------
#include <zabivator>int main( int, char * [] ){ while( Zabivator::жив() ) Zabivator::моск()++; return 0;} |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
а я и ни разу никому ничего не доказывал, я вопрос задавал. вот! -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| zabivator |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 7.6.2006 Где: нск Репутация: 1 Всего: 2 |
Rockie, т.е. ты это и так понимал? Или что? Или про этот ньюнанс забыл?
Пожалуйста. --------------------
#include <zabivator>int main( int, char * [] ){ while( Zabivator::жив() ) Zabivator::моск()++; return 0;} |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Rockie, если ты знаешь основы c++, т. е. знаешь, что память под объект выделяется до вызова конструктора, а также знаешь, что new выделяет память не где попало, а там где свободно, то непонятно зачем было задавать вопрос...фсё таки с основами туговато
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| zabivator |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 7.6.2006 Где: нск Репутация: 1 Всего: 2 |
archimed7592, там таких ньюнансов до фига и больше, с опытом придет =)
Это сообщение отредактировал(а) zabivator - 11.12.2006, 02:10 --------------------
#include <zabivator>int main( int, char * [] ){ while( Zabivator::жив() ) Zabivator::моск()++; return 0;} |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
zabivator, согласен
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| zabivator |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 7.6.2006 Где: нск Репутация: 1 Всего: 2 |
archimed7592, я долго думал, что временем жизни объектов, присвоенных по ссылке, заведует ссылка =) так и писал =) пока один раз не задумался, а почему переданные в параметры ( const std::string & ) не удаляются? И почему const не мешает этому? +))) Казусов можно много вспомнить =)
--------------------
#include <zabivator>int main( int, char * [] ){ while( Zabivator::жив() ) Zabivator::моск()++; return 0;} |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |