急求大神, C++ , 动态分配空间, 释放

漂浮一生 2014-05-09 10:16:56
1、为什么释放后,指针a还是有内存空间,且操作范围更大了???
2、应该如何正确的释放???
# include <iostream>
using namespace std;

int *creat(int n);
void del(int *p);

int main()
{
int *a;

a = creat(4);

del(a); //释放动态分配的空间

for (int i = 0; i < 5; i++) //问题:释放后为什么还可以向a[i]赋值,且访问的范围可以更大??
a[i] = 1;

return 0;
}

int *creat(int n)
{
int *p = new int[n]; //动态分配大小为n * sizeof(int)的空间

for (int i = 0; i < n; i++)
cin >> p[i];

return p; //返回动态分配空间的首地址
}

void del(int *p)
{
delete []p;
p = NULL;
}
...全文
202 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2014-05-11
  • 打赏
  • 举报
回复
引用
for (int i = 0; i < 5; i++) //问题:释放后为什么还可以向a[i]赋值,且访问的范围可以更大?? a[i] = 1;
释放(归还)了的内存, 已经不属于你。访问不属于的资源,行为未定义。
liarenduxing 2014-05-11
  • 打赏
  • 举报
回复
你定义的int *a 本身未释放掉,传递参数的时候是把a的地址传给p,删除的也只是p 想要删除a本身,可以传递引用型指针void del(int *&p),调用时把a传递给函数就可以了
漂浮一生 2014-05-11
  • 打赏
  • 举报
回复
引用 16 楼 ri_aje 的回复:
楼主听说过未定义行为吗?没有的话就搜一下吧。
懂了,释放后,我的指针a就是未定义行为了,谢了
码工许师傅 2014-05-11
  • 打赏
  • 举报
回复
引用 2 楼 accsoar 的回复:
你用void del(int *p) 释放a后,a不是NULL,还是指向原来的地址,尽管地址空间已经释放了 要想释放后a为NULL,del应该这样: void del(int **p) { delelte [](*p); *p = NULL; }
正解,内存已经释放了,只不过@a515360208 你的del这样写改的是del的参数int* p; main里的a没有影响
ri_aje 2014-05-11
  • 打赏
  • 举报
回复
楼主听说过未定义行为吗?没有的话就搜一下吧。
漂浮一生 2014-05-11
  • 打赏
  • 举报
回复
程序中a是否成为了野指针???
漂浮一生 2014-05-09
  • 打赏
  • 举报
回复
引用 1 楼 jiandingzhe 的回复:
本来就是这样啊。C/C++不检查内存边界,不检查指针的合法性。
虽然不检测边界,在del之前,a[4]运行会出错,del之后,a[4]就没错了,如何解释
hjl0508 2014-05-09
  • 打赏
  • 举报
回复
引用 9 楼 a515360208 的回复:
[quote=引用 7 楼 hjl0508 的回复:] 不清楚,不过我用你的代码又发现了个新问题
我的怎么加上后还是这样的 假设输入:1 2 3 4 输出:1 2 3 4 X X X X X //这5个数不确定[/quote] 我也不是很清楚,我也是才学c++没多久,就是试着调试运行你的代码,发现了这个问题,应该是跟内存分配有关吧。
jmppok 2014-05-09
  • 打赏
  • 举报
回复
C++是一种神奇的预言
漂浮一生 2014-05-09
  • 打赏
  • 举报
回复
引用 8 楼 Symfund 的回复:
楼主对指针,及指针的指针(双重指针**,三重指针***),指针作为入参,指针作为返回值要好好再重温下。
进行del操作后,导致a成了野指针,是这样理解吗??? 但为什么对a[4]的操作时合法的???
漂浮一生 2014-05-09
  • 打赏
  • 举报
回复
引用 7 楼 hjl0508 的回复:
不清楚,不过我用你的代码又发现了个新问题

int *creat(int n);
void del(int *p);

int main()
{
	int *a;

	a = creat(4);

	del(a);    //释放动态分配的空间

	for (int i = 0; i < 5; i++)        //问题:释放后为什么还可以向a[i]赋值,且访问的范围可以更大??
		a[i] = 1;
	for (int i = 0; i < 5; i++)    //我加的输出
		cout<<a[i]<<endl;
	system("pause");

	return 0;
}

int *creat(int n)
{
	int *p = new int[n];    //动态分配大小为n * sizeof(int)的空间

	for (int i = 0; i < n; i++)
		cin >> p[i];
	/*for (int i = 0; i < n; i++)  //加不加这段代码后面输出结果竟然不一样。。。。。加上会输出五个一,不加的话就不正常了
		cout <<p[i]<<endl;*/

	return p;    //返回动态分配空间的首地址
}

void del(int *p)
{   
	delete []p;
	p = NULL;
}
我的怎么加上后还是这样的 假设输入:1 2 3 4 输出:1 2 3 4 X X X X X //这5个数不确定
Symfund 2014-05-09
  • 打赏
  • 举报
回复
楼主对指针,及指针的指针(双重指针**,三重指针***),指针作为入参,指针作为返回值要好好再重温下。
hjl0508 2014-05-09
  • 打赏
  • 举报
回复
不清楚,不过我用你的代码又发现了个新问题

int *creat(int n);
void del(int *p);

int main()
{
	int *a;

	a = creat(4);

	del(a);    //释放动态分配的空间

	for (int i = 0; i < 5; i++)        //问题:释放后为什么还可以向a[i]赋值,且访问的范围可以更大??
		a[i] = 1;
	for (int i = 0; i < 5; i++)    //我加的输出
		cout<<a[i]<<endl;
	system("pause");

	return 0;
}

int *creat(int n)
{
	int *p = new int[n];    //动态分配大小为n * sizeof(int)的空间

	for (int i = 0; i < n; i++)
		cin >> p[i];
	/*for (int i = 0; i < n; i++)  //加不加这段代码后面输出结果竟然不一样。。。。。加上会输出五个一,不加的话就不正常了
		cout <<p[i]<<endl;*/

	return p;    //返回动态分配空间的首地址
}

void del(int *p)
{   
	delete []p;
	p = NULL;
}
漂浮一生 2014-05-09
  • 打赏
  • 举报
回复
引用 2 楼 accsoar 的回复:
你用void del(int *p) 释放a后,a不是NULL,还是指向原来的地址,尽管地址空间已经释放了 要想释放后a为NULL,del应该这样: void del(int **p) { delelte [](*p); *p = NULL; }
不释放前对a[4]操作会报出错误的,为什么释放后反而没有问题了,不太理解
AndyStevens 2014-05-09
  • 打赏
  • 举报
回复
你是delete,还是不delete,内存就在那里,不多不少。
Symfund 2014-05-09
  • 打赏
  • 举报
回复
晕,有人抢了我沙发!
Symfund 2014-05-09
  • 打赏
  • 举报
回复
# include <iostream> using namespace std; int *creat(int n); void del(int **p); int main() { int *a; a = creat(4); del(&a); //释放动态分配的空间 for (int i = 0; i < 5; i++) //问题:释放后为什么还可以向a[i]赋值,且访问的范围可以更大?? a[i] = 1; return 0; } int *creat(int n) { int *p = new int[n]; //动态分配大小为n * sizeof(int)的空间 for (int i = 0; i < n; i++) cin >> p[i]; return p; //返回动态分配空间的首地址 } void del(int **p) { delete [] (*p); *p = NULL; }
accsoar 2014-05-09
  • 打赏
  • 举报
回复
你用void del(int *p) 释放a后,a不是NULL,还是指向原来的地址,尽管地址空间已经释放了 要想释放后a为NULL,del应该这样: void del(int **p) { delelte [](*p); *p = NULL; }
jiandingzhe 2014-05-09
  • 打赏
  • 举报
回复
本来就是这样啊。C/C++不检查内存边界,不检查指针的合法性。
forget0915 2014-05-09
  • 打赏
  • 举报
回复


插断点进去单步运行瞧一瞧,一切疑问一目了然,调试时把内存这个窗口打开哦

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧