...
Я бы не сказал, что я читаю бабушкин учебник. Всетаки Лафоре последнего издания.
Я бы не доверил писать учебник по программированию
французской актрисепролистал я по диагонали книжку. в начале сказано что полностью удовлетворяет стандарту. врут. через 100 страниц уже вовсю юзают всякую микросовтовскую хрень. ну еще в нескольких местах позабавила меня эта книженция. воды очень много. видимо поэтому тебе всё так тяжко даётся.
рассказываю про время жизни динамически выделенных(созданных) объектов
будет у нас для опытов такой класс
class A {
std::string m;
public:
A() : m("default") {
std::cout << __FUNCTION__ "(" << m << ")" << std::endl;
}
A(const std::string &str) : m(str) {
std::cout << __FUNCTION__ "(" << m << ")" << std::endl;
}
~A() {
std::cout << __FUNCTION__ "(" << m << ")" << std::endl;
}
};
Память можно выделять на стеке (еще называют автоматической памятью), можно в куче (еще называют динамической памятью)
примеры кто когда сколько проживёт
#include <iostream>
#include <string>
#include <memory>
// добавить описание нашего класса
int main()
{
std::cout << __LINE__ << std::endl;
// выделенный таким образом объект
// будет жить пока программа не выйдет из данного блока
A a0("test 0 stack alloc");
std::cout << __LINE__ << std::endl;
// а1 будет жить пока не вызовут delete
A* a1 = new A("test 1 heap alloc");
std::cout << __LINE__ << std::endl;
// вызвали, a1 умирает
delete a1;
std::cout << __LINE__ << std::endl;
// создали еще раз
a1 = new A("test 2 heap alloc");
std::cout << __LINE__ << std::endl;
// не вызвали, не умирает
// создали пачку объектов
// для каждого вызовется конструктор по умолчанию
A* a2 = new A[10];
std::cout << __LINE__ << std::endl;
// убили, для всех вызовется деструктор
delete [] a2;
std::cout << __LINE__ << std::endl;
{
// нам временно понадобился еще объект
std::cout << __LINE__ << std::endl;
A a3("test 3 stack alloc");
std::cout << __LINE__ << std::endl;
}
// тут о нем останутся лишь воспоминания
std::cout << __LINE__ << std::endl;
// сам объект auto_ptr<A> создаётся на стеке,
// но он всего лишь обёртка над указателем на
// реальный объект который лежит в куче
std::auto_ptr<A> a4(new A("auto_ptr 1"));
std::cout << __LINE__ << std::endl;
{
// если объект слишком тяжёл для стека,
// но ссцыкотно что вожет возникнуть исключение
// или просто забудем удалить его по выходу из
// блока можно завернуть его в auto_ptr сам он
// много места не схавает и когда сам будет умирать
// убьёт и контролируемый им объект
std::cout << __LINE__ << std::endl;
std::auto_ptr<A> a4(new A("auto_ptr 2"));
std::cout << __LINE__ << std::endl;
}
// a1 в просрации. остальное освобождено
std::cout << __LINE__ << std::endl;
return 0;
}
auto_ptr deprecated в новом стандарте. ибо подавляющее большинство не осилило его политики передачи владения при копировании. но в данном примере чисто как гуард для освобождения по выходу из области видимости вполне подойдёт.
Обязательно к прочтению
http://www.rsdn.ru/article/cpp/ObjectsAndPointers.xmlhttp://www.rsdn.ru/article/cpp/ObjectsAndPointers2.xmlhttp://www.rsdn.ru/article/cpp/smartptr.xmlhttp://www.rsdn.ru/Forum/Info/FAQ.cpp.whennew.aspxhttp://www.rsdn.ru/article/cpp/XXtraps64bit.xml