目录
直接内存管理
局部静态对象:局部静态对象所在函数被执行时初始化局部静态对象,当函数执行完成时不会释放对象,程序终止时释放对象,分配在静态存储区。
临时对象:随函数的执行,与结束,初始化与回收,分配在栈区。
new分配方式我们称为动态分配(分配在堆上):直接内存管理(new / delete);
初始化问题:
int *pointe = new int ;//初值未定义
string *mystr = new string ;//空字符串,调用了默认构造函数
int *pointi = new int(100);//给了初值的。
string *mystring2 = new string (5,'a'); //有5个a的字符串
vector<int> *pointv = new vector<int> {1,2,3,4,5}; //一个容器对象,仅有5个元素
值初始化:
string *mystr3 = new string();//也是空字符串
int *pointe1 = new int();//初始化为了0
new对象的时候能够进行值初始化就进行值初始化为好,防止它的值没有被初始化;
在c++11中,auto和new可以配合使用
string *mystr4 = new string (5,'a');
auto mystr5 = new auto(mystr4);//mystr5和4指向同一块内存的mystr5 = string **
//类似于 string **mystr5 = new string*(mystr4);//不建议使用,要谨慎。
cout << mystr4->c_str() <<endl;
cout << ( (*mystr5)->str() )<<endl;
cout <<*mystr4<<" "<<*mystr5 <<endl;
不要忘记delete
const对象也可以动态分配
const int *pointcost = new const int (200); 指向常量不能赋值
有new不然delete。成对使用,回收new分配的内存(释放内存)。
不是new的不能使用,只能delete一次,不能delete多次。
(空指针可以删除多次,但是没有意义)
建议delete后,置空,表明该指针不指向任何对象了,方便后期问题排查。
C++11开始出现了“智能指针”,new忘记了delete,智能指针会帮助你delete。
观察内存泄露
用MFC应用程序,可以帮助发现内存泄露,只有在程序退出的时候才会出现
所以要当作一个小帮助。(vs2017 MFC的应用程序)不用深入,如果想看,可以看侯捷老师的书。