15:08 

преампула

Foul thing
¡ʎuunɟ ʇou sı sıɥʇ
У нас есть старший программист. Типа крутой перец, все дела. И вот я на днях в его коде нахожу следующее (все имена в целях конспирации изменены):



Говорю:
- Чувак, у тебя память течет.
- С чего вдруг?
- Ну как. Ты создаешь объект, потом указателю на этот объект присваиваешь адрес нового объекта, который, очевидно, создается в функции someFunc, а потом удаляешь этот новый объект. Исходный объект при этом теряется и никогда не удалится.
- Да ну, someFunc его скорее всего удаляет.
- Невозможно. Чтобы она могла удалить старый объект, нужно ей передавать в качестве параметра указатель на него. А такого параметра у нее нет.
- Ну блин... А, вот, смотри! Я же присваиваю указателю ptr новое значение! Значит, старое удаляется.
- Ты чего? У тебя указатель начинает указывать на новый участок памяти, а память по старому адресу не освобождается!
- МАКС, НУ ЧТО ТЫ В ТАКИЕ ДЕБРИ СИ ПЛЮС ПЛЮСА ЛЕЗЕШЬ!

Уже неделю под впечатлением хожу от такой крутости.

URL
Комментарии
2018-03-25 в 15:35 

Юльсанна
сижу, курю
хорошо помню, что мы эти дебри на втором курсе проходили

2018-03-25 в 15:46 

Foul thing
¡ʎuunɟ ʇou sı sıɥʇ
Суть в том, что это не дебри, а самая простейшая элементарщина.

URL
2018-03-25 в 16:12 

Заболекарь
Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь

Type *ptr = new Type();

...

auto someFunc = [ptr]() {
   delete ptr;
   return new Type();
};

...

ptr = someFunc();

...

delete ptr;


:dance:

(на самом деле, конечно, вряд ли так и было, он бы знал)

2018-03-25 в 17:13 

Юльсанна
сижу, курю
Foul thing, это был сраказм.

2018-03-25 в 17:39 

Foul thing
¡ʎuunɟ ʇou sı sıɥʇ
Заболекарь
Там абсолютно точно не лямбда )

URL
2018-03-25 в 18:16 

Заболекарь
Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Foul thing, или, например, так (но тоже что-то не верится):


Type *ptr = new Type();

...

class F {
   Type* p;
   public:
   F(Type* q) {
      p = q;
   }
   Type* operator()() {
      delete p;
      return new Type();
   }
};

F someFunc(ptr);

...

ptr = someFunc();

...

delete ptr;

2018-03-25 в 19:04 

Foul thing
¡ʎuunɟ ʇou sı sıɥʇ
Заболекарь
Да всё проще там. Вместо того, чтбы сделать

Type *ptr = someFunc();

он делает

Type *ptr = new Type();
ptr = someFunc();

Банально теряет память. Мы проверяли, память течет.

Меня смущает то, что человек, который гордо именуется Старшим Программистом, называет это ОМГ дебрями С++.

URL
2018-03-25 в 19:49 

Заболекарь
Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Это весьма печально.

2018-03-25 в 19:53 

8115
Может он просто боится "потерять лицо" и наспех сообразил такой отмаз про дебри. Такие ошибки обычно допускаешь, когда пишешь на нескольких языках, включая те, что со сборщиком мусора.

2018-03-25 в 21:57 

zHz00
Foul thing, меня на днях тоже один специалист озадачил. Программа на голом Си. Он сказал, что переменная, объявленная вне функций -- локальная переменная. Потому что она видна только внутри модуля. Вот если бы она во всех модулях была видна -- тогда она бы была глобальной.

Я спросил, как же тогда называется переменная, объявленная внутри функции? Разве не ЭТО локальная переменная? Он сказал, что это "просто переменная внутри функции".

К сожалению, у меня из головы вылетело, что переменная вне функций по-умолчанию действительно видна во всех модулях (если в них упомянуть её как extern). А чтобы она была не видна, её надо объявлять как static.

     

Temporary Internet Flies

главная