// 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 参考文章

#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
point  0x61fef4     新对象b的地址, b与a之间相差8个字节
0x405004            静态变量地址不变,静态变量属于整个类
0x61fef4            属于局部变量,普通变量存在 栈空间上,地址连续
0x61fef8
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       
point  0x791108
0x405004       
0x791108       
0x79110c       
width: 10the pointer is released.
width: 30the pointer is released.
point  0x61fef8
0x405004
0x61fef8
0x61fefc
point  0x61fef0
0x405004
0x61fef0
0x61fef4
width: 3the pointer is released.
width: 1the pointer is released.
                    delete释放的指针,再访问例1#include &lt;iostream&gt;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 = 
				
静态变量是一个特殊的局部变量,通过前面的学习我们知道,在函数内部定义一个局部变量,函数调用结束之后这个变量就会被销毁,不能继续使用了。而静态变量不同,静态变量在初始化之后,会在程序运行期间会一直存在。 和局部变量相比,静态变量具有一下特点: 当函数执行完毕后,静态变量不会消失; 静态变量只能在函数内部使用; 静态变量只会被初始化一次; 静态变量初始化的值可以省略,默认值为 null; 静态变量的初始值只能是具体的字符串、数值等,而不能是一个表达式。 也就是说,静态变量的初始化只进行一次,而且是在.
1 静态局部变量在静态存储区内分配存储单元。在程序运行期间都不释放。 2 对静态局部变量是在编译时赋初值的,即只赋值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上一次函数调用结束时的值。 3 静态局部变量,如果定义的时候没有赋初值,编译时自动赋初值0或者空字符。 4 静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它,在其他函数中,它是"不可见"的...
传递给delete的指针必须指向动态分配的内存,或者是一个空指针。 delete一块并非new的内存,或将相同的指针值释放多次,其行为是未定义的。 编译器不能分辨一个指针所指向的对象是静态还是动态分配的。 编译器也不能分辨一个指针所指向的内存是否已经释放。 delete一个已经delete的指针,为什么有时候会报错有时候不会?一个指针delete后是什么状态? reference1:使用delete删除指针(转) - romanten - 博客园 (c
C++delete函数用于回收new分配的内存空间。 C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。 在针对简单的基本数据类型,使用delete也可...
首先要理解生存周期与作用域的区别: 生存周期: 变量从定义到销毁的时间范围。存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变量之外的局部变量都存放于栈中。 作用域: 变量的可见代码域(块作用域,函数作用域,类作用域,程序全局作用域)。 static变量是指静态的变量,不管是在全局还是局部声明的static
static 的用法 static关键字是C, C++中都存在的关键字, 它主要有三种使用方式, 其中前两种只指在C语言中使用, 第三种在C++中使用(C,C++中具体细微操作不尽相同, 本文以C++为准).(1)局部静态变量 (2)外部静态变量/函数(3)静态数据成员/成员函数下面就这三种使用方式及注意事项分别说明 (1)局部静态变量
1,malloc free和new delete的区别   malloc 和 free 在对于普通变量是可以混合使用的,但是malloc和free是函数;   new 和delete 是操作符,速度更快; Test *tp = (Test*)malloc(sizeof(Test)); //不会调用对象的构造函数 //p(10, 20); tp-&gt...
int * p = (int * ) malloc(sizeof(int) ) ;  int * p = (int * ) malloc(sizeof(int)*10);   生成一个数组的空间 int * p = new int (10) ;  生成一个int型内存空间,并指向 10  int * p = new int[10]  ;  生成数组的空间。