КИТА unofficial
Май 11, 2024, 08:11:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   ПРАВИЛА Помощь WIKI PDA Войти Регистрация  


Страниц: [1]   Вниз
  Печать  
Автор Тема: Искусство программиования (задача 7)  (Прочитано 7802 раз)
0 Пользователей и 1 Гость смотрят эту тему.
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« : Июль 27, 2007, 12:55:16 »

Меня на собеседовании завалили на вопросе:

1. Можно ли вызвать внутри метода класса:

Код:
delete this;

И что при этом произойдет ?
« Последнее редактирование: Июль 27, 2007, 03:17:52 от vimmax » Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #1 : Июль 27, 2007, 01:42:14 »

С++?
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
tendervampire
Бакалавр
**

Карма: +12/-0
Offline 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 Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #3 : Июль 27, 2007, 02:20:20 »

tendervampire выложи свой код, плиз


Sochin да, это С++.
« Последнее редактирование: Июль 27, 2007, 02:32:50 от vimmax » Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #4 : Июль 27, 2007, 02:48:00 »

А что собственно произойти должно? Метод класса это по сути обычная функция, которая неявно получает указатель на объект this. И этот указатель может использоваться внутри функции также как и любой другой указатель. В том числе и  для удаления объекта. Т.е.
Код:
delete this;
произведет вызов деструктора текущего объекта и освобождение памяти. И тут ошибки не будет. Ошибка возникнет тогда когда после удаления объекта будет произведена попытка обращения к атрибутам разрушенного объекта как в данном методе так и в любых других методах.
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #5 : Июль 27, 2007, 02:57:14 »

Sochin отлично +1. правильный ответ. Будет вызван деструктор и класс удалится. Этот прием очень широко применяется в mfc.

Вопрос №2:
В каких случаях этот прием вызовет крах программы?
 (кроме случая описанного Sochin)
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
tendervampire
Бакалавр
**

Карма: +12/-0
Offline 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 Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #7 : Июль 27, 2007, 03:03:27 »

tendervampire Молодца! Ответь на вопрос №2 и получишь награду !!! Это как раз твой случай. НУ ?
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #8 : Июль 27, 2007, 03:13:53 »

после отработки делита я еще и следующий метод запускал, только и без вызова метода глючит.
Глючит потому что в приведенном коде объект создается статически и в методе осуществляется попытка его удаления оператором delete. Это кстати и есть ответ на вопрос №2.
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #9 : Июль 27, 2007, 03:17:36 »

Sochin мда.. Забрал все плюсы.
оператор delete можно применять только к объектам созданным оператором new.
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
tendervampire
Бакалавр
**

Карма: +12/-0
Offline 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 Offline

Пол: Мужской
Сообщений: 1518



« Ответ #11 : Июль 27, 2007, 10:16:43 »

2 vimmax спасибо за интересный вопрос.

Кстати, да, вопрос таки интересный, спасибо. ))
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
EvilMax
Администратор
Завкаф
*****

Карма: +59/-0
Offline Offline

Пол: Мужской
Сообщений: 1072


Злой и страшный :)


« Ответ #12 : Июль 28, 2007, 09:18:12 »

Вопрос №2:
В каких случаях этот прием вызовет крах программы?
 (кроме случая описанного Sochin)
Нельзя применять этот метод освобждения памяти, если объект является полем другого. Нельзя применять такой метод, если использовался оператор new с синтаксисом размещения: ( new (ptr) Class;  где ptr - указатель на область памяти, где будет размещен экземпляр). Могут быть проблемы, если создавался массив объектов.

Проще сказать, когда можно применять этот метод: delete this безопасно, только если мы имеем одиночный экземпляр созданный обычным вызовом new и это последнее обращение к этому экземпляру. В остальных случаях можно нарваться на проблемы.
Записан

Оптимальная концентрация кофе - это когда код уже дает советы, как его написать, но еще не спорит с тобой и не подкалывает в случае неудач...
---
Существует три способа распространения программного обеспечения: воровство, грабёж и обмен краденым. (c) Неизвестный программист
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #13 : Июль 28, 2007, 09:28:18 »

Проще сказать, когда можно применять этот метод: delete this безопасно, только если мы имеем одиночный экземпляр созданный обычным вызовом new и это последнее обращение к этому экземпляру.
т.е. для общего случая должно быть обеспечено что ни в текущем методе ни выше по стеку вызовов нет больше попыток обращений к этому объекту, в том числе и через другие указатели.
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Penguins Counter Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS! Internetmap
Страница сгенерирована за 0.084 секунд. Запросов: 31.