Обьясните как использовать new и delete
и в чем разница между ипользованием вышеупомянутых операторов и работой с локальными переменными (т.е. время жизни переменной определяется {} в которых она и была создана)
спасибо
On 2002-04-09 1324, TekiL wrote
Обьясните пожалуйста в чем интерес использования new и delete. книжка у меня англицкая и очень запутаная
и в чем разница между ипользованием вышеупомянутых операторов и работой с локальными переменными (т.е. время жизни переменной определяется {} в которых она и была создана)
спасибо
Хм... Если просто разницу то
- при локальной переменной память под нее выделяется в стеке и по выходу из зоны видимости перемнной она удаляется.
- при использовании new память выделяется в "куче"* и сохраянется до тех пор пока не вызван delete (или пока программа не отработает - но это уже клиника)
Резюме
- если объект нужен только в процедуре и никуда наружу не передается и не используется - то используй просто локальную переменную (без new/delete)
- если надо использование объекта в нескольких процедурах тогда надо размещать его в "куче" при помощи new/delete
*"куча" - это такая область памяти специально для размещения объектов в ней
On 2002-04-09 1324, TekiL wrote
Обьясните пожалуйста в чем интерес использования new и delete. книжка у меня англицкая и очень запутаная
и в чем разница между ипользованием вышеупомянутых операторов и работой с локальными переменными (т.е. время жизни переменной определяется {} в которых она и была создана)
спасибо
короче дела такие
если создаешь указатель на объект/массив/структуру/на худой конец переменную, то потом чтоб работать с самим объектом или чем-то еще надо либо заставить этот указатель ссылаться на существующий объект или что-то
MyClass Object;
// объект, без указателя, создается сразу
MyClass *ObjectPointer;
// указатель, пока просто указатель равный NULL
ObjectPinter = *Object;
теперь ObjectPointer указывает на Object, и будет одно и тоже, если сделать
Object.SomeFunc();
и
ObjectPointer->SomeFunc();
второй вариант - new и delete
MyClass *Ptr;
Ptr = new MyClass;
// созлали указатель, потом объект
почему не всегда подходит первый вариант
- динамическое создание массивов (если размер сразу не известен)
- типа того же, только с объектами, когда заранее не известен класс. тогда можно объявить общий класс-предок для всех неизвестных заранее вариантов, на худой конец "пустой указатель" (void*)
еще одна вещь если что-то создаешь с помощью new, то при выходе из зоны видимости и указатель и сам объект/массив/что-то еще по любому уходят в небытье (только если они не static)
в чем разница между ипользованием вышеупомянутых операторов и работой с локальными переменными
а когда машина едет, воздух внутри колеса крутится?
new/delete используются
1. Если нужно создать объект с временем жизни, не ограниченным локальной областью (в отличие от локальных переменных).
2. Если размер выделяемого объекта (объектов) достаточно велик. Если создать локальный объект (объекты), то можно переполнить стек.
3. Если нужно создать объект не фиксированного класса.
4. Если нужно выделить массив объектов неизвестного заранее размера. При этом надо помнить, что если создавался массив (new []), то для его удаления надо вызывать delete [].
Возьми нормальную книжку. Например, Страуструп "Язык программирования C++", Спец. издание.