<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: C++ std 11 changes</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/9429.html</link>
    <description>Здравствуйте!&lt;br&gt;Я, конечно, еще только начинающий специалист в программировании на С++, но меня, однако, удивляет тот факт, что в новом 11 стандарте внесены рад изменений, вызывающих оживленные споры (как и все новое), а некоторые явные неудобства оставлены без изменений. Возьмем конкретный пример с выделением и освобождением памяти:&lt;br&gt;&lt;br&gt;&#091;code&#093;&lt;br&gt;class A&lt;br&gt;&#123;&lt;br&gt;public:&lt;br&gt;  int *p;&lt;br&gt;  A::A() &lt;br&gt;  &#123;&lt;br&gt;    p = new int;&lt;br&gt;  &#125;&lt;br&gt;  A::~A()&lt;br&gt;  &#123;&lt;br&gt;    if (p) delete p;&lt;br&gt;  &#125;&lt;br&gt;  void set()&lt;br&gt;  &#123;&lt;br&gt;    if (p) delete p;&lt;br&gt;    p = new int;&lt;br&gt;  &#125;&lt;br&gt;  void unset()&lt;br&gt;  &#123;&lt;br&gt;    if (p) delete p;&lt;br&gt;    //p = NULL; // without this the program is received SIGSEGV&lt;br&gt;  &#125;&lt;br&gt;&#125;;&lt;br&gt;&lt;br&gt;int main()&lt;br&gt;&#123;&lt;br&gt;  A a;&lt;br&gt;  a.set();&lt;br&gt;  a.unset();&lt;br&gt;  return 0;&lt;br&gt;&#125;&lt;br&gt;&#091;/code&#093;&lt;br&gt;&lt;br&gt;Мы создаем объект класса и выделяем память полю класса методом set().&lt;br&gt;Затем, в некоторый момент времени мы освобождаем память методом unset().&lt;br&gt;При вызове деструктора если явно не обнулить указатель, он будет удален дважды и программа упадет.&lt;br&gt;Почему же в новом стандарте среди прочих изменений не добави</description>

<item>
    <title>C++ std 11 changes (elvenic)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/9429.html#10</link>
    <pubDate>Tue, 10 Apr 2012 15:50:47 GMT</pubDate>
    <description>&lt;br&gt;&amp;gt; Можно, правда, ввести хитрый delete, так чтобы компилятор ловил простые случаи типа &lt;br&gt;&amp;gt; &quot;delete p&quot;, когда ясно, что именно нужно обнулить. Но это не &lt;br&gt;&amp;gt; спасёт, потому что указателей на один и тот же объект теоретически &lt;br&gt;&amp;gt; может быть сколько угодно. Один обнулите, а остальные останутся указателями &quot;в &lt;br&gt;&amp;gt; никуда&quot;.&lt;br&gt;&lt;br&gt;Так именно такой хитрый delete я и имел в виду. И я абсолютно согласен с тем что это не решит всех проблем. &lt;br&gt;&lt;br&gt;&amp;gt; PS. Она полностью решается столь нелюбимыми многими сборщиками мусора ;-) Да, создавая &lt;br&gt;&amp;gt; при этом некоторые новые проблемы, но это уже отдельный разговор.&lt;br&gt;&lt;br&gt;Или smart pointers - например, boost::shared_ptr/boost::weak_ptr. Недавно я решил использовать boost в одном довольно значительном проекте, включая boost&apos;овские smart poiners - стиль программирования изменился и стал напоминать стиль используемий при работе с Java - намного проще работать с динамической памятью. В общем мне понравилось.  После этого был проект где по разным не зависящим от нас причинам мы не могли использоват</description>
</item>

<item>
    <title>C++ std 11 changes (JohnProfic)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/9429.html#9</link>
    <pubDate>Tue, 10 Apr 2012 07:33:08 GMT</pubDate>
    <description>&amp;gt; Можно, правда, ввести хитрый delete, так чтобы компилятор ловил простые случаи типа &lt;br&gt;&amp;gt; &quot;delete p&quot;, когда ясно, что именно нужно обнулить. Но это не &lt;br&gt;&amp;gt; спасёт, потому что указателей на один и тот же объект теоретически &lt;br&gt;&amp;gt; может быть сколько угодно. Один обнулите, а остальные останутся указателями &quot;в &lt;br&gt;&amp;gt; никуда&quot;.&lt;br&gt;&lt;br&gt;Я у себя (когда приспичит чего-нить попрограммировать) использую функцию (примерно):&lt;br&gt;&#091;code&#093;&lt;br&gt;template &amp;lt;typename T&amp;gt;&lt;br&gt;inline void delete0(T*&amp; ptr) &#123;&lt;br&gt;    delete ptr;&lt;br&gt;    ptr = 0; // Да, nullptr тоже хорошо раз уж в теме c++11 :).&lt;br&gt;&#125;&#091;/code&#093;&lt;br&gt;Понятное дело, это не спасет от множества указателей, но выдаст ошибку компиляции при попытке скормить ей не переменную, а что-то еще.&lt;br&gt;</description>
</item>

<item>
    <title>C++ std 11 changes (XAnder)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/9429.html#8</link>
    <pubDate>Tue, 10 Apr 2012 05:44:14 GMT</pubDate>
    <description>&amp;gt; поэтому я не вижу технических причин почему бы не &lt;br&gt;&amp;gt; потребовать от компилятора вставку кода для обнуления указателя после завершения вызова &lt;br&gt;&amp;gt; operator delete().&lt;br&gt;&lt;br&gt;Повторю свой вопрос: что будете обнулять, если параметр, переданный оператору delete, - это результат вычисления выражения или вызова функции?&lt;br&gt;&lt;br&gt;Правильный ответ: ничего, поскольку в общем случае компилятор не знает, где лежит этот указатель.&lt;br&gt;&lt;br&gt;Можно, правда, ввести хитрый delete, так чтобы компилятор ловил простые случаи типа &quot;delete p&quot;, когда ясно, что именно нужно обнулить. Но это не спасёт, потому что указателей на один и тот же объект теоретически может быть сколько угодно. Один обнулите, а остальные останутся указателями &quot;в никуда&quot;.&lt;br&gt;&lt;br&gt;Короче, проблема несколько глубже, чем кажется на первый взгляд, и изменением поведения одного лишь оператора delete её не решить.&lt;br&gt;&lt;br&gt;PS. Она полностью решается столь нелюбимыми многими сборщиками мусора ;-) Да, создавая при этом некоторые новые проблемы, но это уже отдельный разговор.&lt;br&gt;</description>
</item>

<item>
    <title>C++ std 11 changes (elvenic)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/9429.html#7</link>
    <pubDate>Mon, 09 Apr 2012 16:45:00 GMT</pubDate>
    <description>&lt;br&gt;&amp;gt; Я думаю тут дело всё таки не в дополнительной инструкции: объект передаётся &lt;br&gt;&amp;gt; по значению, поэтому технически внутри вызываемой функции нельзя изменить значение аргумента &lt;br&gt;&amp;gt; в вызвавшей функции.&lt;br&gt;&lt;br&gt;Теоретически конструкция&lt;br&gt;&lt;br&gt;  delete ptr;&lt;br&gt;&lt;br&gt;не есть вызовом функции, и компилятор это обрабатывает не как вызов функции (да, в эту обработку входит вставка кода вызова operator delete() если он определен); поэтому я не вижу технических причин почему бы не потребовать от компилятора вставку кода для обнуления указателя после завершения вызова operator delete().&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>C++ std 11 changes (Anon1231)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/9429.html#6</link>
    <pubDate>Mon, 09 Apr 2012 15:54:32 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; потому что он передаётся по значению.&lt;br&gt;&amp;gt;&amp;gt; Думаю, это единственное логическое объяснение такому поведению &lt;br&gt;&amp;gt; А также, как я понимаю, комитет по стандарту C++ старается не требовать &lt;br&gt;&amp;gt; в стандарте языка абсолютно ничего что может привести к утрате эффективности &lt;br&gt;&amp;gt; и без чего можно обойтись. Требование обнулять указатель добавляет дополнительные команды &lt;br&gt;&amp;gt; в генерируемый код.&lt;br&gt;&amp;gt; Если вы хотите удобства программирования, как уже тут говорили, есть shared pointers &lt;br&gt;&amp;gt; в библиотеке.  Но иногда нужно выжать из процессора максимум, где &lt;br&gt;&amp;gt; и одна дополнительная машинная операция на обнуление мешает. Вот дизайн C++ &lt;br&gt;&amp;gt; и учитывает подобные вещи.&lt;br&gt;&lt;br&gt;Я думаю тут дело всё таки не в дополнительной инструкции: объект передаётся по значению, поэтому технически внутри вызываемой функции нельзя изменить значение аргумента в вызвавшей функции. &lt;br&gt;Даже если бы существовал такой способ, то это не имело бы значения, поскольку Страуструп задумывал С++ как расширение к Си, поэтому подмножество Си нель</description>
</item>

<item>
    <title>C++ std 11 changes (elvenic)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/9429.html#5</link>
    <pubDate>Mon, 09 Apr 2012 15:40:33 GMT</pubDate>
    <description>&amp;gt;&amp;gt; Почитайте про value type и reference type, многое объяснит.&lt;br&gt;&amp;gt;&amp;gt; В Си есть похожая проблема: функция free() не может обнулить свой аргумент, &lt;br&gt;&amp;gt;&amp;gt; потому что он передаётся по значению.&lt;br&gt;&amp;gt; Думаю, это единственное логическое объяснение такому поведению &lt;br&gt;&lt;br&gt;А также, как я понимаю, комитет по стандарту C++ старается не требовать в стандарте языка абсолютно ничего что может привести к утрате эффективности и без чего можно обойтись. Требование обнулять указатель добавляет дополнительные команды в генерируемый код.&lt;br&gt;&lt;br&gt;Если вы хотите удобства программирования, как уже тут говорили, есть shared pointers в библиотеке.  Но иногда нужно выжать из процессора максимум, где и одна дополнительная машинная операция на обнуление мешает. Вот дизайн C++ и учитывает подобные вещи.&lt;br&gt;&lt;br&gt;  &lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>C++ std 11 changes (handler2006)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/9429.html#4</link>
    <pubDate>Mon, 09 Apr 2012 14:47:11 GMT</pubDate>
    <description>&amp;gt; Почитайте про value type и reference type, многое объяснит.&lt;br&gt;&amp;gt; В Си есть похожая проблема: функция free() не может обнулить свой аргумент, &lt;br&gt;&amp;gt; потому что он передаётся по значению.&lt;br&gt;&lt;br&gt;Думаю, это единственное логическое объяснение такому поведению&lt;br&gt;</description>
</item>

<item>
    <title>C++ std 11 changes (Anon1231)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/9429.html#3</link>
    <pubDate>Mon, 09 Apr 2012 14:24:53 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt; &#091;/code&#093; &lt;br&gt;&amp;gt; Мы создаем объект класса и выделяем память полю класса методом set().&lt;br&gt;&amp;gt; Затем, в некоторый момент времени мы освобождаем память методом unset().&lt;br&gt;&amp;gt; При вызове деструктора если явно не обнулить указатель, он будет удален дважды &lt;br&gt;&amp;gt; и программа упадет.&lt;br&gt;&amp;gt; Почему же в новом стандарте среди прочих изменений не добавили обнуление указателя &lt;br&gt;&amp;gt; оператором delete ?&lt;br&gt;&amp;gt; Если кто-то считает, что автоматическое обнуление указателя здесь неуместно, пожалуйста, &lt;br&gt;&amp;gt; приведите пример, где нам может понадобиться значение указателя после его освобождения &lt;br&gt;&amp;gt; - я с такой ситуацией не сталкивался.&lt;br&gt;&lt;br&gt;Почитайте про value type и reference type, многое объяснит.&lt;br&gt;В Си есть похожая проблема: функция free() не может обнулить свой аргумент, потому что он передаётся по значению.&lt;br&gt;</description>
</item>

<item>
    <title>C++ std 11 changes (Anonimus)</title>
    <link>https://www.opennet.dev/openforum/vsluhforumID9/9429.html#2</link>
    <pubDate>Mon, 09 Apr 2012 13:57:49 GMT</pubDate>
    <description>Смотрите в сторону smart pointer, попробуйте применить например unique_ptr для Вашего примера&lt;br&gt;&lt;br&gt;new и delete достаточно низкоуровневые операции, и одни делают ровно то для чего созданны.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt; &#091;/code&#093; &lt;br&gt;&amp;gt; Мы создаем объект класса и выделяем память полю класса методом set().&lt;br&gt;&amp;gt; Затем, в некоторый момент времени мы освобождаем память методом unset().&lt;br&gt;&amp;gt; При вызове деструктора если явно не обнулить указатель, он будет удален дважды &lt;br&gt;&amp;gt; и программа упадет.&lt;br&gt;&amp;gt; Почему же в новом стандарте среди прочих изменений не добавили обнуление указателя &lt;br&gt;&amp;gt; оператором delete ?&lt;br&gt;&amp;gt; Если кто-то считает, что автоматическое обнуление указателя здесь неуместно, пожалуйста, &lt;br&gt;&amp;gt; приведите пример, где нам может понадобиться значение указателя после его освобождения &lt;br&gt;&amp;gt; - я с такой ситуацией не сталкивался.&lt;br&gt;&lt;br&gt;</description>
</item>

</channel>
</rss>
