一段神奇的 C++代码,大家觉得有没有问题?

2019-04-26 16:15:01 +08:00
 Wangjl

如下代码,我在 vs2015 中,for 循环 1000 遍,没有问题,10000 遍就报错

大家觉得是哪里的问题呢?

#include <stdio.h>

void f(char* p)
{
	delete[] p;
	p = new char[20000];
}

int main()
{
	
	for (int i = 0; i < 10000; i++)
	{
		char *p = new char[2];
		f(p);
		delete[] p;
	}
	getchar();
	return 0;
}

按理说以上代码只是在循环创建 20000 个字节的堆内存,创建了又销毁,不应该出问题才对啊。

大家有什么看法?

7281 次点击
所在节点    C
55 条回复
hihibin
2019-04-27 00:37:06 +08:00
@Wangjl 上条搞错了,习惯直接对地址操作,左值右值都搞错了。。你最后解释对的
WANGJIEKE
2019-04-27 04:19:11 +08:00
我寻思着这不是 double delete 吗。。。double delete 在我电脑上跑一次就炸的,不知道为什么你这跑 1000 次不出问题
missdeer
2019-04-27 08:08:54 +08:00
一楼正解
zwh2698
2019-04-27 08:15:29 +08:00
人生到处都是坑,且行且小心!前途未知概因不曾顿悟。
huluhulu
2019-04-27 08:49:16 +08:00
@iwong0exv2 你这个会影响。你和楼主的案例不一样。
Wangjl
2019-04-27 10:13:52 +08:00
这可能和 vs 有关,我现在又无法重现了,之前 for1000 次都没问题,可昨天晚上,我 for1 次就不行了。 但我做过测试,如果函数内的 p 的本身地址和函数外的 p 的地址一样的话,就不会出问题,我估计我之前那是偶然现象,可能是 vs 的问题。
只要函数内的指针地址和外面的不一样,那一定会挂,因为二次释放。
Wangjl
2019-04-27 10:31:15 +08:00
#include <stdio.h>

void f(char* p)
{
printf("f 函数中 p 指针本身的地址是: %x\n\n", &p);
printf("f 函数中 p 指针里面存放的地址是: %x\n\n", *p);
printf("释放 f 函数中 p 指针里面存放的地址 %x 指向的内存空间\n\n", *p);
delete[] p;
p = new char[20000];

}

int main()
{

for (int i = 0; i < 1000; i++)
{
char *p = new char[2];
printf("外部 p 指针本身的地址是: %x\n\n", &p);
printf("外部 p 指针里面存放的地址是: %x\n\n", *p);
f(p);
printf("释放外部 p 指针里面存放的地址 %x 指向的内存空间\n\n", *p);
delete[] p;

}
getchar();
return 0;
}

以上代码就可以看出原因。
iwong0exv2
2019-04-27 13:59:11 +08:00
@huluhulu 兄弟你也是花厂的?
huluhulu
2019-04-27 15:35:33 +08:00
@iwong0exv2 不是
leido
2019-04-27 16:10:48 +08:00
用 f 的参数 p 指针用引用才对
iwong0exv2
2019-04-27 16:14:29 +08:00
@huluhulu 哦。如果写成 p->next=p;的话,是会修改链表,但反过来写只是利用同一个指针来做遍历,所以并不会修改链表本身。其实我这个解释有点多余,代码本身已经很清楚了。
huluhulu
2019-04-27 16:59:13 +08:00
@iwong0exv2 你是对的
darknoll
2019-04-28 09:10:06 +08:00
char*& p
Chenamy2017
2019-04-28 09:23:16 +08:00
一楼正解,看来指针还需要再好好学习下了
tkhmy
2019-04-28 09:50:56 +08:00
传值,传引用,传指针好好复习一下,你这里是传值的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/558982

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX