vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« : Июль 27, 2007, 12:55:16 » |
|
Меня на собеседовании завалили на вопросе: 1. Можно ли вызвать внутри метода класса: И что при этом произойдет ?
|
|
« Последнее редактирование: Июль 27, 2007, 03:17:52 от vimmax »
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #1 : Июль 27, 2007, 01:42:14 » |
|
С++?
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
tendervampire
Бакалавр
Карма: +12/-0
Offline
Пол:
Сообщений: 112
П.Б.Н.
|
|
« Ответ #2 : Июль 27, 2007, 01:47:23 » |
|
А можно есть мухоморы? Можно. Но умрешь.
Компилятор такую инструкцию допустит, что ему. А исполнение команды приведет к ошибке. Решение получено экспериментальным путем. Компилятор - Майкрософт VC 8.0, но не думаю, что другие компиляторы поведут себя иначе. Если нужно, могу покопать Страуструпа, найти конкретный ответ - почему и как.
|
|
|
Записан
|
- Our arrows will blind out the sun - Then we will fight in the shade!
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #3 : Июль 27, 2007, 02:20:20 » |
|
tendervampire выложи свой код, плиз
Sochin да, это С++.
|
|
« Последнее редактирование: Июль 27, 2007, 02:32:50 от vimmax »
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #4 : Июль 27, 2007, 02:48:00 » |
|
А что собственно произойти должно? Метод класса это по сути обычная функция, которая неявно получает указатель на объект this. И этот указатель может использоваться внутри функции также как и любой другой указатель. В том числе и для удаления объекта. Т.е. произведет вызов деструктора текущего объекта и освобождение памяти. И тут ошибки не будет. Ошибка возникнет тогда когда после удаления объекта будет произведена попытка обращения к атрибутам разрушенного объекта как в данном методе так и в любых других методах.
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #5 : Июль 27, 2007, 02:57:14 » |
|
Sochin отлично +1. правильный ответ. Будет вызван деструктор и класс удалится. Этот прием очень широко применяется в mfc.
Вопрос №2: В каких случаях этот прием вызовет крах программы? (кроме случая описанного Sochin)
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
tendervampire
Бакалавр
Карма: +12/-0
Offline
Пол:
Сообщений: 112
П.Б.Н.
|
|
« Ответ #6 : Июль 27, 2007, 03:02:17 » |
|
Тут того кода... #include <stdio.h> #include<iostream> class A { public: A() { printf("Отработал конструктор\n"); } ~A() { printf("Отработал деструктор\n"); } void destr() { delete this; } void inf() { printf("не дождетесь!!\n"); } }; void main() { A var; var.destr(); // var.inf(); scanf; }
2 Sochin . Согласен, когда проверял, после отработки делита я еще и следующий метод запускал, только и без вызова метода глючит.
|
|
|
Записан
|
- Our arrows will blind out the sun - Then we will fight in the shade!
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #7 : Июль 27, 2007, 03:03:27 » |
|
tendervampire Молодца! Ответь на вопрос №2 и получишь награду !!! Это как раз твой случай. НУ ?
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #8 : Июль 27, 2007, 03:13:53 » |
|
после отработки делита я еще и следующий метод запускал, только и без вызова метода глючит.
Глючит потому что в приведенном коде объект создается статически и в методе осуществляется попытка его удаления оператором delete. Это кстати и есть ответ на вопрос №2.
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #9 : Июль 27, 2007, 03:17:36 » |
|
Sochin мда.. Забрал все плюсы. оператор delete можно применять только к объектам созданным оператором new.
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
tendervampire
Бакалавр
Карма: +12/-0
Offline
Пол:
Сообщений: 112
П.Б.Н.
|
|
« Ответ #10 : Июль 27, 2007, 03:42:09 » |
|
2 Sochin Спасибо за подсказку. 2 vimmax спасибо за интересный вопрос. Так, глядишь, брошу администрирование и вернусь к корням
|
|
|
Записан
|
- Our arrows will blind out the sun - Then we will fight in the shade!
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #11 : Июль 27, 2007, 10:16:43 » |
|
2 vimmax спасибо за интересный вопрос.
Кстати, да, вопрос таки интересный, спасибо. ))
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
EvilMax
Администратор
Завкаф
Карма: +59/-0
Offline
Пол:
Сообщений: 1072
Злой и страшный :)
|
|
« Ответ #12 : Июль 28, 2007, 09:18:12 » |
|
Вопрос №2: В каких случаях этот прием вызовет крах программы? (кроме случая описанного Sochin)
Нельзя применять этот метод освобждения памяти, если объект является полем другого. Нельзя применять такой метод, если использовался оператор new с синтаксисом размещения: ( new (ptr) Class; где ptr - указатель на область памяти, где будет размещен экземпляр). Могут быть проблемы, если создавался массив объектов. Проще сказать, когда можно применять этот метод: delete this безопасно, только если мы имеем одиночный экземпляр созданный обычным вызовом new и это последнее обращение к этому экземпляру. В остальных случаях можно нарваться на проблемы.
|
|
|
Записан
|
Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач... --- Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #13 : Июль 28, 2007, 09:28:18 » |
|
Проще сказать, когда можно применять этот метод: delete this безопасно, только если мы имеем одиночный экземпляр созданный обычным вызовом new и это последнее обращение к этому экземпляру.
т.е. для общего случая должно быть обеспечено что ни в текущем методе ни выше по стеку вызовов нет больше попыток обращений к этому объекту, в том числе и через другие указатели.
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
|