Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мифы о плюсах 
:(
    Опции темы
ТарасАтавин
Дата 7.10.2013, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Миф № 1. Указатели страдают опасностью утечки, якобы забывается delete и поэтому нужен сборщик мусора, который всё адалит автоматически. Я программирую с 1995-го, а конкретно на плюсах с 2001-го. Потратил больше месяца, чтоб добиться утечки. Думаете, я delete забыл? Чёрта с два, он набирается инстинктивно с того самого 2001-го с первого дня использования плюсов и до сих пор. А пропустил я присвоить указатель при увеличении массива. Внимание вопрос: чем мне поможет сборщик? Он ведь не знает, что нужно удалить и нужно ли что то вообще удалять, а чтоб понять это из текста, надо его анализировать, имея знания и подлинный разум, не уступающие автору. В примере с пропущенным присваиванием 
Код
template
<class TItem>
bool
TArray <TItem> ::             Addition                (TItem           &Item           )
{
 TItem  *Data;
 TItem  *Source;
 TItem  *Target;
 size_t  Count;
 Count=this->Count+1;
 if (Count>0)
 {
  Data=new TItem [Count];
  if (Data)
  {
   for (Target=this->Data+this->Count-1, Source=Data+this->Count-1; Source>=Data; --Target, --Source)
   {
    *Source=*Target;
   }
   if (this->Data)
   {
    delete []this->Data;
   }
   *(Data+this->Count)=Item;
  /*Забыты две следующие строки*/
   this->Data =Data;
   this->Count=Count;
   return true;
  }
 }
 return false;
}
 что сделает сборщик? А пропустить delete я так и не смог даже специально. Ни разу с 2001-го.

Это сообщение отредактировал(а) ТарасАтавин - 7.10.2013, 11:25


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
baldina
Дата 7.10.2013, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(ТарасАтавин @  7.10.2013,  11:22 Найти цитируемый пост)
Указатели страдают опасностью утечки, якобы забывается delete и поэтому нужен сборщик мусора

сборщик мусора не только для этого (кстати при его использовании утечки памяти возможны), есть еще висячие ссылки, и это проблема посерьезнее. и придумано оно не для устранения косяков программистских, а для удобства работы. 

по мне - основной недостаток GB не столько в производительности, сколько в концепции, устраняющей определенность с вызовом деструкторов. имхо в императивных языках сборщик мусора не нужен. в функциональных - другое дело, там операции работы с памятью выглядят неестественно.
PM MAIL   Вверх
Amp
Дата 7.10.2013, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 3
Всего: 17



Прилетит исключение, что будешь делать?
PM MAIL   Вверх
ТарасАтавин
Дата 7.10.2013, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(baldina @  7.10.2013,  12:09 Найти цитируемый пост)
сборщик мусора не только для этого (кстати при его использовании утечки памяти возможны), есть еще висячие ссылки, и это проблема посерьезнее.
Миф и заключается именно в том, что он нужен только для этого, проблему гарантированно решает, а без него она не решаема.

Это сообщение отредактировал(а) ТарасАтавин - 7.10.2013, 13:17


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
Static
Дата 7.10.2013, 13:17 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: 1
Всего: 2



Миф №2: Люди, которые "программируют на плюсах" более 10 лет, досконально хорошо знают язык программирования С++.
--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
Alexeis
Дата 7.10.2013, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



  Язык С++ ориентирован на статические конструкции (шаблоны, объекты поля, структуры). Статическое связывание и т.д. Пока это так операций new/delete не так много и можно избежать утечек. Другое дело ситуации, когда на этапе компиляции есть мало информации о структурах данных, когда все это саморазварачивается, связывается, подгружается и т.д. Появляются ситуации когда время жизни объекта неизвестно и зависит от состояния других объектов. А если еще  это все запущено в многопоточной среде, то следить становиться совсем сложно. В примитивных случаях конечно нет проблем отследить выделение/освобождение. Зачастую даже этого делать даже не нужно. В STLе полно контейнеров которые сами за всем следят.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ТарасАтавин
Дата 7.10.2013, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(Alexeis @  7.10.2013,  13:47 Найти цитируемый пост)
Язык С++ ориентирован на статические конструкции (шаблоны, объекты поля, структуры). Статическое связывание и т.д. 
Ну ка обоснуй, чем язык c++ мешает использовать и разрабатывать dll, связывание которых как раз может быть только динамическим. Бейсик мешает, по крайней мере старые его диалекты. А с++? [quote=Alexeis, 7.10.2013,  13:47, post2585578] Пока это так операций new/delete не так много и можно избежать утечек.[quote]. Как раз на c++ c количество new/delete, в отличие от количества malloc/free на чистом c значения не имеет, а динамическое связывание вообще не отличается от статического.

Добавлено через 4 минуты и 28 секунд
Цитата(Alexeis @  7.10.2013,  13:47 Найти цитируемый пост)
Другое дело ситуации, когда на этапе компиляции есть мало информации о структурах данных, когда все это саморазварачивается, связывается, подгружается и т.д. Появляются ситуации когда время жизни объекта неизвестно и зависит от состояния других объектов.
Ну ка приведи пример хоть одной задачи, когда время жизни хоть одного объекта может быть известно, но не в случае, когда количество объектов в каждой области видимости вообще постоянно. Этот случай не принимается, так как ему вообще не нужны new/delete, они ему даже мешают, а нужны обычные именованные статические и автоматические объекты.

Добавлено через 5 минут и 29 секунд
Цитата(Alexeis @  7.10.2013,  13:47 Найти цитируемый пост)
 А если еще  это все запущено в многопоточной среде, то следить становиться совсем сложно. 
Ну ка обоснуй, как динамическая память вообще связана с потоками.

Добавлено через 7 минут и 18 секунд
Цитата(Alexeis @  7.10.2013,  13:47 Найти цитируемый пост)
 В примитивных случаях конечно нет проблем отследить выделение/освобождение. 
В примитивных случаях вообще нет самой задачи что то отслеживать и вообще нет нужды связываться с указателями, так как время жизни всех объектов и всех скалярных переменных известно до начало разработки.



--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
Static
Дата 7.10.2013, 15:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: 1
Всего: 2



Цитата(ТарасАтавин @  7.10.2013,  14:08 Найти цитируемый пост)
Ну ка приведи пример хоть одной задачи, когда время жизни хоть одного объекта может быть известно, но не в случае, когда количество объектов в каждой области видимости вообще постоянно.

Здравый смысл подсказывает, что речь идет о случаях, когда созданный объект "отправляется в самостоятельное плавание" и, таким образом, время его жизни не контролируется кодом, который его создал. А вовсе не о том, что ты заранее не знаешь, сколько точно времени проживет некий объект.

Цитата(ТарасАтавин @  7.10.2013,  14:08 Найти цитируемый пост)
Ну ка обоснуй, как динамическая память вообще связана с потоками.

Примерно так же, как и все остальное. Она не связана с потоками, но многопоточность требует особого подхода, в том числе и к выделению/освобождению памяти.

Цитата(ТарасАтавин @  7.10.2013,  14:08 Найти цитируемый пост)
В примитивных случаях вообще нет самой задачи что то отслеживать и вообще нет нужды связываться с указателями, так как время жизни всех объектов и всех скалярных переменных известно до начало разработки.

А об использовании указателей Вы же сами разговор и начали. А намек на контейнеры STL почему-то проигнорировали.

Человек, который может разговаривать в таком тоне, должен быть способен решать свои проблемы с ЯП самостоятельно, без создания тысяч тем об очевидных и банальных, в общем-то, вещах.

--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
ТарасАтавин
Дата 7.10.2013, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(Alexeis @  7.10.2013,  13:47 Найти цитируемый пост)
В STLе полно контейнеров которые сами за всем следят. 
И загоняют в рамки. А я вот не хочу stlовый вектор, я хочу строго квадратный массив деревьев списков графорв общего вида? Или дерево на 9-ти взаимоортогональных парах левый-правый потомок? Или ещё что нибудь такое, что разработчки stl могли не предусмотреть. Документ должен сам содержать каталоги, но не быть архивом абстрактных файлов? И в этом внутреннем графе каталогов нет понятия ярлыка, но есть понятие "альтернатива" и альтернатива есть второй путь к каталогу/элменту, то есть был некоторый элемент документа, потом в другом каталоге создана его альтернатива, доступ через эту альтернативу есть доступ к самому элементу, как по ярлыку, то есть любое изменение о отразится на самом элементе и его будет видно, если в следующий раз открыть этот же элемент не через альтернативу, но в отличие от ярлыка, удаление самого элемента не означает удаления данных, пока у этого элемента есть хоть одна альтернатива? Да мало ли что я могу придумать. Так вот, даже если разработчики stl угадают и все мои идеи, и всё, что в бреду изобретёт горе-студент, проще будет историку самостоятельно и без утечек реализовать свой контейнер, чем самому страуструпу изучить на столько универсальную супербиблиотеку контейнерных классов, а при её использовании избежать краха по каким нибудь другим, не связанным с утечками, причинам. Одно дело строки, они достаточно стандартны и ничего нового в плане интерфейса для них не придумаешь, поэтому std::string и ни каких гвоздёв. В крайнем случае версия на другой кодировке, например, на равномерном юникоде. Или на utf-8. На utf-16. На dos-кодировке вместо ANSI. На чём угодно, но сам контейнер остаётся тем же. И совсем другое дело все остальные контейнеры, даже динамические массивы. Один хочет хранить всё, а при добавлении нового индекса добавлять элемент, другому подавай разреженный массив, хеш-функцию из целочисленного деления и прямое отождествление соседних элементов друг с другом, третьему нужно исключение при попытке обратиться по несуществующему действительному индексу, у четвёртого индекс есть октодерево, пятый заводит списки коллизий в разреженном массиве, шестому подавай аппроксимацию не существующих элементов полиномом сотого порядка и всё называется одинаково и даже имеет общую декларацию интерфейса.

Добавлено через 1 минуту и 6 секунд
Цитата(Static @  7.10.2013,  15:35 Найти цитируемый пост)
Здравый смысл подсказывает, что речь идет о случаях, когда созданный объект "отправляется в самостоятельное плавание" и, таким образом, время его жизни не контролируется кодом, который его создал. А вовсе не о том, что ты заранее не знаешь, сколько точно времени проживет некий объект.
Здравый смысл подсказывает, что одно означает другое и наоборот.

Добавлено через 8 минут и 36 секунд
Цитата(Static @  7.10.2013,  15:35 Найти цитируемый пост)
А об использовании указателей Вы же сами разговор и начали.
Да. Но нужны они не в 
Код
int main ()
{
 double x, y;
 ScanfКакЕгоТам(x);
 y=sin(x);
 PrintfКакЕгоТам(y);
 return 0;
};
. У меня количество независимых классов с указательными полями не всегда укладывается в первые два десятка, но почему то первая утечка за 13 лет вылезла не из delete, а из присваивания, а обнаружена по отсутствию элементов одного из нескольких десятков вложенных контейнеров на пятом уровне вложения, а вовсе не наблюдением расхода памяти. Наблюдение расхода эти 19*sizof байт за весь сеанс не найдёт, так как расход как раз правильный байт в байт, память утекла совсем не туда, куда следует из мифа.


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
Static
Дата 7.10.2013, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: 1
Всего: 2



Цитата(ТарасАтавин @  7.10.2013,  14:39 Найти цитируемый пост)
Здравый смысл подсказывает, что одно означает другое и наоборот.

В таком случае я не понимаю, чем вызван вопрос о времени жизни. Вы за свои 18 лет работы с кодом не встречали подобных ситуаций?

Добавлено через 1 минуту и 19 секунд
Цитата(ТарасАтавин @  7.10.2013,  14:39 Найти цитируемый пост)
Да. Но нужны они не в <пример кода>

Будем честны - там и с++ не нужен-то.

--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
ТарасАтавин
Дата 7.10.2013, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(Static @  7.10.2013,  15:35 Найти цитируемый пост)
Она не связана с потоками, но многопоточность требует особого подхода, в том числе и к выделению/освобождению памяти.
Многопоточность сама по себе, ни одна особенность того самого подхода вообще ни как не затрагивает указатели. Точно также, как особый подход к покрытию палубным лаком деревянного оленя на капоте "волги" вместо обычного металлического с блестящей поверхностью ни как не влияет на приёмы настойки свч-радиостанции вместо обычной магнитолы. Сложно то и другое, но друг друга эти аспекты не касаются, даже встретившись на одной "волге".

Добавлено через 1 минуту и 59 секунд
Цитата(Static @  7.10.2013,  15:50 Найти цитируемый пост)
В таком случае я не понимаю, чем вызван вопрос о времени жизни. Вы за свои 18 лет работы с кодом не встречали подобных ситуаций?
Я не встречал как раз иных ситуаций. Время жизни всех объектов во всех моих проектах всегда было известно только пользователям, да и то смутно.



--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
Static
Дата 7.10.2013, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: 1
Всего: 2



Я ценю Ваши образные и красивые аналогии, но почему Вы отвечаете не на то, что цитируете?
Я написал про выделение/освобождение памяти - Вы мне про указатели. И не поспоришь, да, на указатели как на таковые многопоточность действительно не влияет. А когда Вам понадобится выделять память в одном потоке, освобождать в другом - вот тогда все будет намного интереснее.

И простите мне этот шаг в сторону, но Вы свои мифы сами придумываете, а потом проецируете их на всех. Я помню, что где-то уже сталкивался с чем-то подобным. И точно - вот же. И что-то с того времени прогресс сомнителен.
--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
ТарасАтавин
Дата 7.10.2013, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(Static @  7.10.2013,  16:07 Найти цитируемый пост)
А когда Вам понадобится выделять память в одном потоке, освобождать в другом - вот тогда все будет намного интереснее.
А какая разница? Крах будет в точности тем же при попытке обратиться к автоматическому объекту в завершённой функции. Мало того, крах будет даже при использовании в одном потоке не действительного значения обычной скалярной глобальной статической переменной, изменённой в другом потоке. И динамическая память ни чего к этой проблеме синхронизации не добавляет.

Добавлено @ 18:16
Цитата(Static @  7.10.2013,  16:07 Найти цитируемый пост)
Я помню, что где-то уже сталкивался с чем-то подобным. И точно - вот же. И что-то с того времени прогресс сомнителен. 
А ничего, что эту тему именно я поднял не там, а здесь? Там же я отвечал. Рассказывается же миф сторонниками c#, которых я обзываю зарешёченными. Ищи на геймдеве мой пост про тюрьму разума мелкософт.

Это сообщение отредактировал(а) ТарасАтавин - 7.10.2013, 18:18


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bsa
Дата 11.10.2013, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(ТарасАтавин @  7.10.2013,  16:39 Найти цитируемый пост)
есть понятие "альтернатива" и альтернатива есть второй путь к каталогу/элменту

Это называется ссылка. Бывают жесткие ссылки (в большинстве ФС каталоги . и .. - это жесткие ссылки соответственно на текущий каталог и на родительский) и символические - специальный файл, который содержит относительный или абсолютный путь к фактическому файлу.
В твоем случае это жесткая ссылка. Удаление файла происходит при удалении всех ссылок на него.
Не надо придумывать новую терминологию.

Эта задача решается с помощью нескольких примитивных структур (нода, файл и каталог), std::list и std::shared_ptr. Изобретать свои контейнеры нет смысла.

Цитата(ТарасАтавин @  7.10.2013,  16:39 Найти цитируемый пост)
Наблюдение расхода эти 19*sizof байт за весь сеанс не найдёт, так как расход как раз правильный байт в байт, память утекла совсем не туда, куда следует из мифа. 
Если количество выделенной памяти не равно количеству освобожденной на момент завершения программы, то это простейшая утечка. Она легко находится утилитами типа valgrind.
Цитата(ТарасАтавин @  7.10.2013,  19:13 Найти цитируемый пост)
Крах будет в точности тем же при попытке обратиться к автоматическому объекту в завершённой функции.
Какое отношение имеет автоматический объект к динамической памяти? smile 
Цитата(ТарасАтавин @  7.10.2013,  19:13 Найти цитируемый пост)
Мало того, крах будет даже при использовании в одном потоке не действительного значения обычной скалярной глобальной статической переменной, изменённой в другом потоке.
Да?!?  smile Рекомендую посмотреть реализацию фьютекса (это то, что мы называем мьютексом).

Цитата(ТарасАтавин @  7.10.2013,  19:13 Найти цитируемый пост)
И динамическая память ни чего к этой проблеме синхронизации не добавляет.
Речь идет о другом. Когда один поток удаляет объект, а второй с этим объектом работает. Например, производя увеличение его внутреннего хранилища.

Цитата(ТарасАтавин @  7.10.2013,  19:13 Найти цитируемый пост)
А ничего, что эту тему именно я поднял не там, а здесь? Там же я отвечал. Рассказывается же миф сторонниками c#, которых я обзываю зарешёченными. Ищи на геймдеве мой пост про тюрьму разума мелкософт.
Эх, почему люди, которые ничего не знают и знать не хотят, так настойчиво пытаются навязывать свое мнение другим.

PM   Вверх
boostcoder
Дата 21.10.2013, 20:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



GC нужен для...ээмм.. хз для чего, правда. в С++ есть отличная идиома - RAII.

зы
немного оффтоп, но думаю многим пригодится.
есть проект, довольно таки большой проект, ~150000 loc.
начали подготавливать проект к релизу, и обнаружились "стандартные" Си`шные чудеса в виде произвольных падений программы. при том валилась программа в совершенно разных участках, порою даже не связанных(разве что адресным пространством). я в течении нескольких дней понял, что мы имеем дело либо с порчей кучи/стека, либо с висячими указателями, либо и то, и другое.
и вот, три человека, в течении месяца, полный рабочий день занимаются только поисками этих багов. по истечении месяца стало понятно, что ничего найти не получается. стандартные средства типа отладчика и стек-трейсера никак не помогают, а только путают. так же опробован valgrind, который, к слову, тоже только "голову морочил". не для плюсового кода он, однако.

и вот, как последняя надежда, решили попробовать AddressSanitizer, который был включен в gcc-4.8.х(так же был добавлен и ThreadSanitizer, но его пока не приходилось опробовать), и, с его помощью, за один день пофиксили баги.
баги, как оказалось, были однотипные, и всего три - висячие указатели smile

хз, сколько еще месяцев потребовалось бы на поиски этих багов, без asan %)

вот такая вот история. но даже в этой ситуации я не думаю, что в С++ нужен GC. тут виноваты исключительно кривые руки ;)


Это сообщение отредактировал(а) boostcoder - 22.10.2013, 13:01
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1127 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.