C++指针的new、delete等问题整理

关于指针删除的问题

C++无论何种数据,是否要delete关键看其空间是否使用new分配的。
1,函数冲定义的局部变量指针,单纯是一个局部变量是不用delete;
2,C++ 如果类中有一个指针数据成员,而没有用new, 析构函数也是不用delete的;
在类或函数中,int* ,char* 这些只要不是new的,也同样不用释放,系统会自动把他们占的内存释放掉,只有new的才会手动的去delete
原理:
int*, char* ,这些定义是局部变量,存在于栈上,比如int *p;p在栈上,而且p的值也是栈的一个地址。
但是当int *p = new int ;这时候,p这个变量是在栈上的。但是p的值是一个地址,这个地址是堆上的一个地址。如果不delete p;那么,这个地址会一直被占用着,不能被其他的对象所使用,所以我们用完这个地址,要把这个地址释放掉。
因此栈的空间会自动释放,而堆里的空间必须手动释放。

关于指针需不需要new的问题

如果被指向的实体的内存大小是固定的或已知道的,可以定义这个实体让指针指向它,此时不需要用new。
但是有时实体的内存大小是不知道的,例如能够存贮N个整数的数组,N是一个需要输入的变量,此时就应该使用new int[N]了。还有变长结构体的实现。

使用new创建对象是创建在堆中的,需要手动管理内存空间。
不使用new创建对象时,对象的内存空间是在栈中的,作用范围只在函数内部,函数执行完成后就会调用析构函数,删除该对象。
当我们希望自己控制什么时候释放对象就需要用到new了,new对变量内存的管理的更灵活。

new有两个功能:
1)分配动态对象所需内存;
2)调用构造函数来构造对象;
new的底层(glibc实现)最终还是调用了malloc,malloc用来分配一块内存,然后new在该内存上调用placement new已调用构造函数。
比C语言malloc多了第二步;
new表达式的结果是获得一块内存,这块内存的首地址用一个指针表示。

指针位置改变后释放内存

char * data = new char[500];
char *data_copy = data;//保存一个修改前的指针副本

.........

data  = data_copy;//删除前恢复指针地址
delete [] data;
data=NULL;
data_copy=NULL;

或:

int * ip_recv;//先定义指针
int *ip_recv_copy;//指针副本
void init_point()
{
	ip_recv =new int;//在函数中分配内存空间
	ip_recv_copy=ip_recv;;//保存一个修改前的指针副本
}
void del_point()
{
	ip_recv=ip_recv_copy;//恢复指针地址
	delete ip_recv;//删除指针
	ip_recv=NULL;
	ip_recv_copy=NULL;
}

MFC 动态创建的对话框关闭时指针删除问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值