C++ delete之静态变量问题详解

 

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.
*/

 

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程宝库的更多内容!

 1.static的作用(1) 修饰局部变量时,只初始化一次,延长了局部变量生命周期,直到程序结束才释放。(2)修饰全局变量,全局变量智能在本文件访问,不能在其 ...