全局对象在程序启动时分配,在程序结束时销毁。
局部对象,当我们进入其所在的程序块时被创建,在离开块时被销毁。
局部static对象,在第一次使用前分配,在程序结束时销毁。
动态分配对象时,它的生存期与他们在哪里创建是无关的,只有当显式的被释放时,这些对象才能被销毁。
为了更安全使用动态对象,标准库定义了两个智能指针类型来管理动态分配的对象,当一个对象应该被释放的时候,指向他的智能指针可以确保自动的释放他。
程序用堆来存储动态分配的对象
静态内存用来保存局部static对象,类static数据成员,以及定义在任何函数之外的变量
栈内存用来保存在函数内的非static对象。分配在静态内存或者栈内存中的对象由编译器自动创建和销毁。
动态内存的管理通过一对运算符来完成:
new:在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象进行初始化。
delete:接受一个动态对象的指针,销毁该对象,并释放与之关联的内存。
内存泄露:忘记释放内存的时候,
智能指针:智能指针类似常规指针,区别在于:它自动释放所指向的对象
新标准提供了两种智能指针,其区别在于管理底层指针的方式:share_ptr允许多个指针指向同一个对象,unique_ptr则独占所指向的对象,
weak_ptr:伴随类,是弱引用。这三种类型都指向memory头文件中。
最安全的分配和使用动态内存的方法是调用一个名为make_shared的标准库函数,此函数在动态内存中分配一个对象并且初始化他,返回指向此对象的share_ptr,
share_ptr<int> p3=make_shared<int>(42);
我们可以认为每一个share_ptr都有一个关联的计数器,通常称其为引用计数,当其计数器为零的时候,他就会自动释放自己所管理的对象。
当指向一个对象的最后一个share_ptr被销毁的时候,他就会自动的销毁此对象,它是通过另一个特殊的成员函数--析构函数完成销毁工作的。析构函数控制此类型的对象销毁时做什么工作。
析构函数一般用来释放对象所分配的资源。
string *ps=new string;//初始化为空string
int *pi=new int(1024);//pi指向值为1024的int
auto p1=new auto(obj);//p指向一个与obj类型相同的对象
当使用auto的时候,我们是通过初始化器来推断类型的,所以,只有当括号中仅有单一一个初始化器的时候才可以使用auto;
const int *ps=new const (1024);
const string *ps=new const string;
我们不能讲一个内置类型指针转换成一个智能指针,必须使用直接初始化形式来初始化一个智能指针
share_ptr<int> p1=new int(1024);//错误,必须使用直接初始化形式
share_ptr<int> p2(new int (1024));
与share_ptr不同,没有类似make_shared的标准库函数返回一个unique_str,当我们定义一个unique_str时候,需要将其绑定到一个new返回的指针上,初始化unique_str必须采用直接初始化的形式
。。。。。。。
未完待续。