动态内存与智能指针

Posted wsw_seu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态内存与智能指针相关的知识,希望对你有一定的参考价值。

  全局对象在程序启动时分配内存,在程序结束时销毁。对于局部自动变量,我们进入其定义所在的程序块时被创建,离开时被销毁。局部static对象在第一次使用前分配,程序结束时销毁。

什么叫局部自动对象和局部静态对象呢?形参和函数体内部定义的变量称为局部变量。对于普通局部变量,当函数的控制路径经过变量定义语句时创建该对象,当到达定义所在的块末尾时销毁。我们把只存在于块执行期间的对象称为自动对象。形参是一种自动对象,函数开始时为形参申请内存,形参定义在函数体作用域之外,所以一旦函数终止,形参也被销毁。某些时候我们需要令局部变量的生命周期贯穿函数调用之后的时间。可以将局部变量定义成static类型从而获得这样的变量。局部静态对象在程序第一次执行经过该对象定义语句时初始化,并且直到程序结束时才销毁。在此期间,即使对象所在的函数体结束执行也不会对它有影响。

  静态内存用来保存局部静态对象,类static数据成员以及定义在任何函数之外的变量。栈内存用来保存定义在函数内的非static变量。

  智能指针的本质思想:将堆对象的生命周期用栈对象(智能指针)来管理,当new一个堆对象时,立刻用智能指针来接管。具体做法是:

在构造函数中进行初始化(用一个指针指向堆对象),在析构函数中调用delete来释放对象。
由于智能指针本身是一个栈对象,它的作用域结束的时候,自动调用析构,从而调用了delete释放了堆对象

 1 #include<boost/scoped_ptr.hpp>
 2 #include<iostream>
 3 using namespace std;
 4 class X
 5 {
 6 public:
 7     X() { cout << "X..." << endl; }
 8     ~X() { cout << "~X..." < endl; }
 9 };
10 int main()
11 {
12     cout << "Enteringmain..." << endl;
13     {
14         //创建智能指针栈对象p,管理X
15 //在构造函数中进行初始化(用一个指针指向堆对象),在析构函数中调用delete来释放对象。
16 //scoped_ptr所有权不能转移,不能进行拷贝,也不能被赋值。
17         boost::scoped_ptr<X> p(new X);
18     }
19     cout << "Exiting main..." << endl;
20     return 0;
21 }
22 /*
23 Entering main...
24 X...
25 ~X
26 Exiting main...
27 */
28 
29 //shared_ptr线程安全的
30 #include<boost/shared_ptr.hpp>
31 #include<iostream>
32 using namespace std;
33 class X
34 {
35 public:
36     X() { cout << "X..." << endl; }
37     ~X() { cout << "~X..." < endl; }
38 };
39 int main()
40 {
41     cout << "Enteringmain..." << endl;
42 //构造一个堆对象,用一个智能指针来管理。
43 //首先调用new,再调用p1的构造函数,创建一个指针来指向X
44     boost::shared_ptr<X> p1(new X);
45     cout << p1.use_count() << endl;
46     boost::shared_ptr<X>  p2=p1;
47     cout << p2.use_count << endl;
48     p1.reset();//p1断开
49     cout << p2.use_count << endl;
50     p2.reset();//引用计数变为0,自动释放
51     cout << "Exiting main..." << endl;
52     return 0;
53 }
54 /*
55 Enteringmain...
56 X...
57 1
58 2
59 1
60 ~X...
61 Exiting main...
62 */

 

以上是关于动态内存与智能指针的主要内容,如果未能解决你的问题,请参考以下文章

动态内存与智能指针

12.1 动态内存与智能指针

第十二章 动态内存与智能指针

动态内存——动态内存与智能指针

动态内存1(动态内存与智能指针)

c++动态内存管理与智能指针