C++指针删除问题
#include"stdafx.h"#include<iostream>usingnamespacestd;intmain(array<System::String^>^...
#include "stdafx.h"
#include<iostream>
using namespace std;
int main(array<System::String ^> ^args)
{
int number=1;
int *pNumber=&number;
cout<<*pNumber<<endl;
cout<<pNumber<<endl;
delete pNumber;
pNumber=&number;
cout<<*pNumber<<endl;
cout<<pNumber<<endl;
int temp;
cin>>temp;
return 0;
}
把pNumber地址删除后再次为pNumber附上number的地址。再打印出number的地址与number的值。为什么会陷入死循环? 展开
#include<iostream>
using namespace std;
int main(array<System::String ^> ^args)
{
int number=1;
int *pNumber=&number;
cout<<*pNumber<<endl;
cout<<pNumber<<endl;
delete pNumber;
pNumber=&number;
cout<<*pNumber<<endl;
cout<<pNumber<<endl;
int temp;
cin>>temp;
return 0;
}
把pNumber地址删除后再次为pNumber附上number的地址。再打印出number的地址与number的值。为什么会陷入死循环? 展开
5个回答
展开全部
new delete不是字面意义上的新建和删除
new表示申请内存
delete表示释放内存(退还,归还给系统)
这是一对组合命令
(1) human *p=new human; 声明一个指针变量p,并分配空间
(2)delete p; 释放p,释放后,p原来指向的内存空间不再为本程序所用,但变量p还是有效的,可以用,如(3)
(3)p=0; 给变量p赋值为0
(4)delete p; 这句有问题了,当p没有指向任何内存空间时,进行Delete操作有可能会出现系统异常
(5)p=new human; 这里再次申请一次内存空间,是允许的,p指向一个新的内存对象地址。
return 0;
new表示申请内存
delete表示释放内存(退还,归还给系统)
这是一对组合命令
(1) human *p=new human; 声明一个指针变量p,并分配空间
(2)delete p; 释放p,释放后,p原来指向的内存空间不再为本程序所用,但变量p还是有效的,可以用,如(3)
(3)p=0; 给变量p赋值为0
(4)delete p; 这句有问题了,当p没有指向任何内存空间时,进行Delete操作有可能会出现系统异常
(5)p=new human; 这里再次申请一次内存空间,是允许的,p指向一个新的内存对象地址。
return 0;
展开全部
你申请了一段内存用来存储指针,然后这些指针又各自申请了一段内存。那你释放的时候当然要把每个指针指向的内存先释放,最后再释放存放指针的这段内存。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
delete和new是成对出现的,他主要是删除那些动态分配的内存空间,如new、malloc和realloc函数分配的空间。你这个删除的不是动态的,那个地址是指向number,你调用了delete相当于把number变量的内存空间释放了,这个是不合法,在delete那一步已经出错了。你可以进入单步执行验证看看是哪一步出错的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我同意一楼的说法 不过我运行正常哦 可能是编译器的关系
另外附上网友关于delete的说明
delete之后,下次再重新申请的时候可以再申请这块内存地址,也就是将这块地址放到了空闲链表上,对于这块地址的内容,没有进行清空处理(也没有必要);由于你没有将p赋为NULL,所以p指针还是指向这块内存空间。
如果不delete的话,你这块内存是不能在申请使用的,也就是所谓的内存泄露。
对于delete之后的指针p,此时是“野指针”。
一般的正确做法是:
int * p = new int ;
if (p == NULL)(千万不要忘了这句话!!!)
{
//判断是否为空!使用空指针是不对的!!
}
delete p;
p = NULL;(千万不要忘了这一句话!!)
另外附上网友关于delete的说明
delete之后,下次再重新申请的时候可以再申请这块内存地址,也就是将这块地址放到了空闲链表上,对于这块地址的内容,没有进行清空处理(也没有必要);由于你没有将p赋为NULL,所以p指针还是指向这块内存空间。
如果不delete的话,你这块内存是不能在申请使用的,也就是所谓的内存泄露。
对于delete之后的指针p,此时是“野指针”。
一般的正确做法是:
int * p = new int ;
if (p == NULL)(千万不要忘了这句话!!!)
{
//判断是否为空!使用空指针是不对的!!
}
delete p;
p = NULL;(千万不要忘了这一句话!!)
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询