c++指针存储应用程序和释放内存的问题

C++中指针在new和delete操作的时候对内存堆都做了些什么呢。下面解:

1、指针的new操作:

指针在new之后,会在内存堆中分配一个空间。而指针中存放的是这个空间的地址。如:

void main(){
 int *p = new int(4);
 cout << p << endl;
 cout << *p << endl;
}
输出为:
0x00431BF0
4

分别为分配的空间地址和地址内存放的值。

假设写为:

void main(){
 int *p = new int(4);
 cout << *(int *)0x00431BF0 << endl;
}
输出为:4

程序的意思就是将0x00431BF0内存地址開始的4个byte的块取出转换为int类型输出。即直接读取内存。

2、指针的delete操作:

指针在delete的时候。会将指针指向的内存区域释放掉,而指针同内存区域的联系并没有被切断,仍然会仅仅想原来指向的内存区域。如:

void main(){
 int *p = new int(4);
 cout << p << endl;
 cout << *p << endl;
 delete p;
 cout << p << endl;
 cout << *p << endl;
}

程序输出:
0x00431BF0
4
0x00431BF0
-572662307

能够看到p前后指向的地址是同样的,而指向地址的内存区域被释放。

3、空指针:

空指针指向的内存区域为内存的首地址,是不可读写的区域,即空指针不提供操作。删除空指针是安全的(由于它什么也没做)。所以,在写构造函数,
赋值操作符。或其它成员函数时,类的每一个指针成员要么指向有效的内存,要么就指向空,那在你的析构函数里你就能够仅仅用简单地delete 掉他们。而不用
操心他们是不是被new 过。如:

void main(){
 int *p = NULL;
 cout << p << endl;
} //输出0x00000000

4、取出内存区域的值

在取某内存地址開始的一个区域的值的时候,取出的值取决于用来取值的类型,譬如int为4个byte。char为1个byte。程序如:

void main(){
 int a[2] = {261,0};
 int *pi = a;
 char *p = (char*)pi;
 cout << *(int *)p++ << endl;  //取出p地址,转化为取4个byte,并取出内容。之后p向后移动一位
 cout << *(int *)p << endl;    //取出p地址,转化为取4个byte,并取出内容
 cout << (int)*p << endl;      //取出1个char类型,并转换为int型
 cout << (int)*(char *)pi << endl;  //取出pi地址。转换为char类型,取出内容,并转换为int型
}
程序输出:
261
1
1
5

a的存储区域安排为:byte1=5,byte2=1,byte3~byte8 = 0;
所以*(int *)p++取的为byte1到byte4。 之后的*(int *)p取的是byte2到byte5。
(int)*p取的它是byte2;(int)*(char *)pi就拿byte1,在转换到后int类型

版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值