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 ? Если кто-то считает, что автоматическое обнуление указателя здесь неуместно, пожалуйста, приведите пример, где нам может понадобиться значение указателя после его освобождения - я с такой ситуацией не сталкивался.
|
- C++ std 11 changes, XAnder, 17:46 , 09-Апр-12 (1)
- C++ std 11 changes, Anonimus, 17:57 , 09-Апр-12 (2)
- C++ std 11 changes, Anon1231, 18:24 , 09-Апр-12 (3)
- C++ std 11 changes, handler2006, 18:47 , 09-Апр-12 (4)
> Почитайте про value type и reference type, многое объяснит. > В Си есть похожая проблема: функция free() не может обнулить свой аргумент, > потому что он передаётся по значению.Думаю, это единственное логическое объяснение такому поведению
|