C++中delete之静态变量问题的示例分析

发布时间:2021-09-26 10:10:15 作者:小新
来源:亿速云 阅读:132

这篇文章将为大家详细讲解有关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.
*/

关于“C++中delete之静态变量问题的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

推荐阅读:
  1. MySQL之递归小问题的示例分析
  2. c++中STL库容器之集合set的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ delete

上一篇:js中的宏任务和微任务怎么用

下一篇:如何安装linux sybase

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》