您的位置:首页 > 编程语言 > C语言/C++

c++中指针的内存申请和内存释放问题

2014-07-11 10:13 260 查看
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型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: