|
|
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
A* a = new A(); A* b(a); A* c(a); delete b; что будет с "c" и "a" ?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 12:43 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
Словами наверное так: если несколько указателей ссылаются на одну и ту же область памяти, что будет если для одного из них сделать delete ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 12:48 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
Удалиться то что было там записано, а оставшийся указатель будет указывать в никуда. Деструктор производного должен вызвать деструктор базового, а тот проверить на соответствие указателя: располагаются ли по нему то, что должно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 13:17 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
А может просто упасть сославшись на то, что освобождаемая память не может быть освобождена, т.к. ее держит другая переменная ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 13:19 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
A - нет такого встроенного типа данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 13:22 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
A - нет такого встроенного типа данных. <--- не совсем понятно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 13:28 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
Деструктор производного должен вызвать деструктор базового, а тот проверить на соответствие указателя: располагаются ли по нему то, что должно. <--- вы имеете в виду, что при delete a; вызывается деструктор a->~A() ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 13:30 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
производный и базовый это разве не о наследовании, а я имею в виду 2 указателя на одну область памяти... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 13:34 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
Зависит от реализации конструктора А. Он может либо клонировать экземпляры, либо создавать ссылочные обьекты (интерфейсы). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 13:42 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
А - это пользовательский тип данных . Пусть это будет класс А значит у класса должен быть конструктур и деструктор, которые нужно описывать. Потом у тебя идет вызов функций где создаются локальные переменные, которые автоматически уничтожаются при выходе из функции, какое значение должна возвращать функция тоже нужно описать. delete b - это не правильно, так как ты еще не создал объект. А вот переменная а в функции передается как формальный параметр и при выходе она может быть уничтожена, а может быть и нет. Опять же как ты эту функцию опишешь.Вообщем или вместо А выбери встроенный тип или опиши класс А. (или структуру А, или массив А, то есть создай пользовательский тип данных). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 13:42 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
delete b - это не правильно, так как ты еще не создал объект. Почему не создал? A* b(a); <--- вызывается конструктор копии по умолчанию. Для "a" была выделена память в куче(динамически). После A* b(a); "b" - это то же что и "a" фактически, потому для него вызовется delete b; Само "A" - не принципиально - вместо него может быть int: int* a = new int(10); int* b(a); delete b; // int* b(a) эквивалентно int* b = a; (с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 14:02 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
Забыл сказать что язык - C++ :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 14:09 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
OisOЗабыл сказать что язык - C++ :-)ну тут 2 варианта: либо С, либо С++, исходя из названия форума. С не подходит, т.к. нету оператора new. остается С++ Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 14:17 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
OisOdelete b - это не правильно, так как ты еще не создал объект. Почему не создал? A* b(a); <--- вызывается конструктор копии по умолчанию. Для "a" была выделена память в куче(динамически). После A* b(a); "b" - это то же что и "a" фактически, потому для него вызовется delete b; Само "A" - не принципиально - вместо него может быть int: int* a = new int(10); int* b(a); delete b; // int* b(a) эквивалентно int* b = a; (с) Если конструктор по умолчанию вызывается то и деструктор должен вызваться. Просто в это пследовательности кода delete b - не уместно. скорее нужно сделать так b (a){ //// что то делает .... delete [] a; return 0; } А потом нужно смотреть как b(a) используется. может быть ничего и не нужно больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 14:24 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
При удалении массиива нельзя юзать delete, нужон delete[] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 14:25 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
Ну вот пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 14:41 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
OisOНу вот пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 1-е сообщение cerebrum кажется ответило на вопрос, единственно что я не понял о каких деструкторах в нем идет речь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 15:51 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
единственно что я не понял о каких деструкторах в нем идет речь... Я посчитал а и b - классами, вот и замудрил.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 16:08 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
to Teem: Все равно это код не работает. Какие-то ошибки выдает? Не компилится? Какой компилятор? Спрашиваю, потому что у меня это работает и не ругается - что и явилось причиной вопроса на форуме... Вообщето в этом коде нет ошибок. Попробуй (если под виндовс) убери argc argv из int main(...) и тип int перед main попробуй замени на void. И убери комментарии - может компилятор их ошибочно понял изза русских символов... Я компилирую в g++ под FreeBSD 6.0 to Cerebrum: Я посчитал а и b - классами, вот и замудрил.. Ну вообщето разницы нет - в последнем примере a и b - указатели на тип int, но поскольку класс - это пользовательский тип, то int можно заменить на любой другой класс в том числе и описаный пользователем и ничего не поменяется... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 16:58 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
Результат работы программы: Pointer b: 0x804b030 Pointed object: 10 Pointer a: 0x804b030 Pointed object: 10 After delete a; Pointer b: 0x804b030 <-- delete был вызван но ничего не поменялось Pointer a: 0x804b030 <-- Pointed object *b: 10 <-- Pointed object *a: 10 <-- *a = 25; a: 0x804b030 *a: 25 b: 0x804b030 *b: 25 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 17:06 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
Да я в консольном режиме работал С VS6. Оператор delete вообще как пятое колесо.Но с интами все понятно - это встроенные типы данных. int* b = a так компилятор пропускает , int* b(a) а так ругается на а. Проверил отладчиком - вроде память везде очищается. Но консоль тут не показатель. Все таки нужно если под Винду кодировать, то вариант уборки мусора нужно посмтреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 17:08 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
OisOДеструктор производного должен вызвать деструктор базового, а тот проверить на соответствие указателя: располагаются ли по нему то, что должно. <--- вы имеете в виду, что при delete a; вызывается деструктор a->~A() ? Деструктор производного класса обычно НЕ ВЫЗЫВАЕТ деструктор базового. Это делается автоматически и в нужном порядке. Никаких соответствий указателей проверять нигде не надо -- чему они должны соответствовать ? Просто не осуществлять доступ к этому объекту ни через один из указателей на него -- и все. Лучше в этом случае указатели занулять, но это не обязательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 21:45 |
|
||
|
Пожалуйста, подскажите новичку!
|
|||
|---|---|---|---|
|
#18+
MasterZiv OisOДеструктор производного должен вызвать деструктор базового, а тот проверить на соответствие указателя: располагаются ли по нему то, что должно. <--- вы имеете в виду, что при delete a; вызывается деструктор a->~A() ? Деструктор производного класса обычно НЕ ВЫЗЫВАЕТ деструктор базового. Это делается автоматически и в нужном порядке. Никаких соответствий указателей проверять нигде не надо -- чему они должны соответствовать ? Просто не осуществлять доступ к этому объекту ни через один из указателей на него -- и все. Лучше в этом случае указатели занулять, но это не обязательно. 1. См. мое выше, про классы 2. У тебя 2 указателя на одну и ту же область памяти, например, занимаемую объектом производным от CObject. По одному из указателей ты решил его завалить, вызвав delete. Второй указатель получается смотрит в никуда, так? И теперь если ты заново попытаешься завалить удаленный объект через второй указатель получается, что программа воспримет это как должное и освободит для системы n-байт несуществующего объекта? Я говорю это не голословно, я сам писал менеджер памяти в одной из своих прог (не консольных). И прога успешно падала или переходила в режим отладки с сообщением, что не может освободить память по указателю. Вот здесь и нужна проверка на существование этого объекта, по крайней мере в данной ситуации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 07:54 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=380&tid=2032287]: |
0ms |
get settings: |
5ms |
get forum list: |
21ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 354ms |

| 0 / 0 |
