关于C++申请堆空间的问题

软件和网站开发以及相关技术探讨
回复
头像
rob2468
帖子: 185
注册时间: 2009-03-19 8:39
联系:

关于C++申请堆空间的问题

#1

帖子 rob2468 » 2010-04-15 13:15

代码: 全选

int *a=new int;
int *b=new;
a=b;
a和b开始都申请了堆空间,然后又执行了a=b的操作,a,b指向同一片空间,那么我delete b;就把b的空间释放了,那么a此时也不能再使用了,第一行申请的地址怎么释放呢
chenwl
帖子: 509
注册时间: 2008-09-06 10:04

Re: 关于C++申请堆空间的问题

#2

帖子 chenwl » 2010-04-15 15:03

rob2468 写了:

代码: 全选

int *a=new int;
int *b=new;
a=b;
a和b开始都申请了堆空间,然后又执行了a=b的操作,a,b指向同一片空间,那么我delete b;就把b的空间释放了,那么a此时也不能再使用了,第一行申请的地址怎么释放呢
这就是臭名昭著的内存泄漏阿。
头像
sweating
帖子: 200
注册时间: 2009-02-07 18:01

Re: 关于C++申请堆空间的问题

#3

帖子 sweating » 2010-04-15 16:44

你确认要玩这种内存泄漏的事情?
好吧,等程序退出就可以释放了XD
头像
rob2468
帖子: 185
注册时间: 2009-03-19 8:39
联系:

Re: 关于C++申请堆空间的问题

#4

帖子 rob2468 » 2010-04-15 20:04

代码: 全选

Type MinHeap<Type>::[color=#FF4000]DeleteTop()[/color]
{
	if(IsEmpty())
	{
		cout<<"堆已空"<<endl;
		exit(1);
	}
	[color=#FF0000]Type temp=heapArr[0];[/color]
	heapArr[0]=heapArr[heapCurrentSize-1];//堆末元素上移到堆顶
	heapCurrentSize--;
	FilterDown(0);
	[color=#FF4000]return temp;[/color]
}
这是我一段程序中的一些,主要是红色字体的部分

代码: 全选

firstChild=new HuaffmanTreeNode;
		secondChild=new HuaffmanTreeNode;
		*firstChild=hp.DeleteTop();
		*secondChild=hp.DeleteTop();
然后这些又是调用到上面那段程序的,我的这种写法有没有造成内存泄漏(上面程序中的heapArr数组是动态申请的),根据我的调试,貌似下面程序中的firstChild和secondChild指向了跟上面程序的heapArr中同一片地址
像这样的程序返回的临时变量也是确切的跟heapArr指针变量统一的啊
头像
sweating
帖子: 200
注册时间: 2009-02-07 18:01

Re: 关于C++申请堆空间的问题

#5

帖子 sweating » 2010-04-15 23:34

firstChild=new HuaffmanTreeNode;
secondChild=new HuaffmanTreeNode;
我觉得如果new那只构造函数没有提前预防的话应该会出现内存泄漏
不排除编译器自作聪明帮你加了析构
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 关于C++申请堆空间的问题

#6

帖子 BigSnake.NET » 2010-04-16 0:05

firstChild=new HuaffmanTreeNode;
secondChild=new HuaffmanTreeNode;
*firstChild=hp.DeleteTop();
*secondChild=hp.DeleteTop();

一般情况下是不会的
有一个例外:后三行抛出了异常
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 关于C++申请堆空间的问题

#7

帖子 BigSnake.NET » 2010-04-16 0:08

你最后哪句话有点奇怪
DeleteTop 不是返回值么,何来”指向“
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
basncy
帖子: 321
注册时间: 2009-11-19 10:40

Re: 关于C++申请堆空间的问题

#8

帖子 basncy » 2010-06-19 13:51

我不知道C++,但我知道C是这样解决的。(为什么在getaddrinfor后必须freeaddrinfo,就是防止内存泄露)

代码: 全选

int *a=malloc(sizeof(int));
	int *b=malloc(sizeof(int));	
	int *tmp;
	tmp=b;
	a=b;
	free(b);
	free(tmp);
回复