The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
C++ std 11 changes, !*! handler2006, 09-Апр-12, 16:43  [смотреть все]
Здравствуйте!
Я, конечно, еще только начинающий специалист в программировании на С++, но меня, однако, удивляет тот факт, что в новом 11 стандарте внесены рад изменений, вызывающих оживленные споры (как и все новое), а некоторые явные неудобства оставлены без изменений. Возьмем конкретный пример с выделением и освобождением памяти:


class A
{
public:
  int *p;
  A::A()
  {
    p = new int;
  }
  A::~A()
  {
    if (p) delete p;
  }
  void set()
  {
    if (p) delete p;
    p = new int;
  }
  void unset()
  {
    if (p) delete p;
    //p = NULL; // without this the program is received SIGSEGV
  }
};

int main()
{
  A a;
  a.set();
  a.unset();
  return 0;
}

Мы создаем объект класса и выделяем память полю класса методом set().
Затем, в некоторый момент времени мы освобождаем память методом unset().
При вызове деструктора если явно не обнулить указатель, он будет удален дважды и программа упадет.
Почему же в новом стандарте среди прочих изменений не добавили обнуление указателя оператором delete ?
Если кто-то считает, что автоматическое обнуление указателя здесь неуместно, пожалуйста, приведите пример, где нам может понадобиться значение указателя после его освобождения - я с такой ситуацией не сталкивался.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру