C++ delete之静态变量问题详解
程序员文章站
2022-03-13 22:42:08
目录delete释放的指针,再访问例1#include using namespace std;class box{public: box(int,int);...
delete释放的指针,再访问
例1
#include <iostream> using namespace std; class box { public: box(int,int); ~box(); void volume(); static int height; int width; int length; }; box::box(int wi, int le) { width = wi; length = le; } box::~box(){cout<<"the pointer is released."<<endl;} void box::volume() { cout<<height*width*length<<endl; } int box::height = 100; int main() { box* p = new box(10,20); delete p; cout<<p->height<<endl; cout<<box::height<<endl; cout<<"width" <<p->width<<endl; cout<<"length "<<p->length<<endl; p->volume(); return 0; }
//输出:
/*100
100
width 16257288
length 16253120
-1812113408*/
例2
#include <iostream> using namespace std; int * func(){ int * a = new int(10); return a; } int main(){ int * p = func(); cout << *p << endl;//10 //delete关键字用来释放堆区数据 delete p; // p = new int(5); cout << *p << endl;//10 return 0; }
//输出
// 10
// 16584968
解释:
访问 delete 之后的内存是一个未定义行为。 未定义行为可能产生任何结果,包括但不限于:产生期望的结果,产生未期望的结果,产生随机的结果,产生无法解释的结果,运行错误,随机的运行时错误,编译错误,等等 ---- 你只是放弃了对这片内存的所有权。获得所有权的人对这片内存做什么(或者说什么都不做)都不关你的事
static 变量的储存区域
https://blog.csdn.net/qq_32900237/article/details/107094377?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242参考文章
例1
#include <iostream> using namespace std; class box { public: box(int,int); ~box(); void volume(); static int height; int width; int length; }; box::box(int wi, int le) { width = wi; length = le; } box::~box(){cout<<"width: "<< width <<"the pointer is released."<<endl;} void box::volume() { cout<<height*width*length<<endl; } int box::height = 100; int main() { box* p = new box(10,20); cout<<"point "<<p<<endl; //point 0xe91470 cout<<&(p->height)<<endl; //0x405004 cout<<&(p->width)<<endl; //0xe91470 cout<<&(p->length)<<endl; //0xe91474 cout<<sizeof(p)<<endl; //4 cout<<sizeof(*p)<<endl; //8 cout<<sizeof(box)<<endl; //8 //delete p; //width: 10the pointer is released. 用new创建的对象,必须自己用delete回收,不然系统不会帮助回收,出现内存泄漏 box a = box(1,2); box *pa = &a; cout<<"point "<<pa<<endl; //point 0x61ff00 cout<<&(pa->height)<<endl; //0x405004 cout<<&(pa->width)<<endl; //0x61fefc cout<<&(pa->length)<<endl; //0x61ff00 cout<<sizeof(pa)<<endl; //4 cout<<sizeof(*pa)<<endl; //8 cout<<sizeof(a)<<endl; //8 box b = box(3,4); box *pb = &b; cout<<"point "<<pb<<endl; //point 0x61fef4 cout<<&(pb->height)<<endl; //0x61fef4 cout<<&(pb->width)<<endl; //0x61fef4 cout<<&(pb->length)<<endl; //0x61fef8 cout<<sizeof(pb)<<endl; cout<<sizeof(*pb)<<endl; return 0; } /* point 0xe91470 新对象的地址 0x405004 静态变量和普通变量地址不连续,是静态变量存在数据段 0xe91470 普通变量存在 开辟的堆上 0xe91474 4 指针大小 8 对象所占内存大小 8 类大小 point 0x61fefc 新对象a的地址 0x405004 静态变量地址不变,静态变量属于整个类 0x61fefc 属于局部变量,普通变量存在 栈空间上 0x61ff00 4 8 8 point 0x61fef4 新对象b的地址, b与a之间相差8个字节 0x405004 静态变量地址不变,静态变量属于整个类 0x61fef4 属于局部变量,普通变量存在 栈空间上,地址连续 0x61fef8 4 8 width: 3the pointer is released. 自动调用析构函数 width: 1the pointer is released. 自动调用析构函数 */
例2 帮助理解
#include <iostream> using namespace std; class box { public: box(int,int); ~box(); void volume(); static int height; int width; int length; }; box::box(int wi, int le) { width = wi; length = le; } box::~box(){cout<<"width: "<< width <<"the pointer is released."<<endl;} void box::volume() { cout<<height*width*length<<endl; } int box::height = 100; int main() { box* p = new box(10,20); cout<<"point "<<p<<endl; cout<<&(p->height)<<endl; cout<<&(p->width)<<endl; cout<<&(p->length)<<endl; cout<<sizeof(p)<<endl; cout<<sizeof(*p)<<endl; cout<<sizeof(box)<<endl; // delete p; box* p1 = new box(30,40); cout<<"point "<<p1<<endl; cout<<&(p1->height)<<endl; cout<<&(p1->width)<<endl; cout<<&(p1->length)<<endl; cout<<sizeof(p1)<<endl; cout<<sizeof(*p1)<<endl; cout<<sizeof(box)<<endl; delete p; delete p1; box a = box(1,2); box *pa = &a; cout<<"point "<<pa<<endl; cout<<&(pa->height)<<endl; cout<<&(pa->width)<<endl; cout<<&(pa->length)<<endl; cout<<sizeof(pa)<<endl; cout<<sizeof(*pa)<<endl; cout<<sizeof(a)<<endl; box b = box(3,4); box *pb = &b; cout<<"point "<<pb<<endl; cout<<&(pb->height)<<endl; cout<<&(pb->width)<<endl; cout<<&(pb->length)<<endl; cout<<sizeof(pb)<<endl; cout<<sizeof(*pb)<<endl; return 0; } /* point 0x791470 0x405004 0x791470 0x791474 4 8 8 point 0x791108 0x405004 0x791108 0x79110c 4 8 8 width: 10the pointer is released. width: 30the pointer is released. point 0x61fef8 0x405004 0x61fef8 0x61fefc 4 8 8 point 0x61fef0 0x405004 0x61fef0 0x61fef4 4 8 width: 3the pointer is released. width: 1the pointer is released. */
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!
下一篇: MySQL连接控制插件介绍