malloc free new delete的有关问题
malloc free new delete的问题
下面代码CreateList函数最后如果释放了pTemp,就访问不到创建的数据,那么如何理解malloc之后一定要free防止内存泄露的问题?
还有new和delete相对于malloc和free有什么优点?不是构造析构这点。
谢谢大家先~
------解决方案--------------------
去除构造析构来说,new是操作符,是编译器的东西 malloc是库函数,能看到代码……
------解决方案--------------------
malloc和free只负责分配和释放内存。
有关new和delete操作符看看下面这篇文章:
http://blog.csdn.net/xiexievv/article/details/8258237
------解决方案--------------------
CreateList()返回你的pTemp
main()函数返回之前 或者你确定你已经不再使用pTemp的地方释放
malloc/free就是单纯的申请释放内存
new/delete是操作符,这就意味着你可以重载
另外 new的用法大致可以分为3种:new表达式new operator,new操作符operator new,可以在已经申请的内存块上创建对象placement new
对于第3种比如
char *pTemp = (char *)malloc(sizeof(OBJ));
pTemp = new(pTemp)OBJ();
------解决方案--------------------
malloc 创建之后随时可以free 、但是你可以按需压来释放、最坏情况是在程序退去之前释放掉、也就是楼上说的main函数中return 0;之前 在下项目的情况下 根据创建对象的生命周期、不需要的时候释放! 像你这个程序 你可以单独写一个del函数来删除你、每次退去之前调用。你在man函数里面删除不能用一个简单的free来删除!
------解决方案--------------------
你的源代码中 free是在while之后也就是其实创建了很多pTemp 指针、但是你删除的之后最后一个 肯定是有问题的。。
正确的删除时根据你显示的那个方法获取每一个链表的节点指针 再一一删除!
------解决方案--------------------
将
malloc和free
象
fopen和fclose
那样用。
下面代码CreateList函数最后如果释放了pTemp,就访问不到创建的数据,那么如何理解malloc之后一定要free防止内存泄露的问题?
还有new和delete相对于malloc和free有什么优点?不是构造析构这点。
谢谢大家先~
#include<stdio.h>
#include<stdlib.h>
typedef struct LearList
{
int num;
struct LearList* pNext;
}LearList;
LearList* pHead = NULL;
LearList* pTail = NULL;
void CreateList();
void ShowList();
void CreateList()
{
int num;
LearList* pTemp;
printf("请输入一个数");
scanf("%d",&num);
while(num)
{
pTemp = (LearList*)malloc(sizeof(LearList));
pTemp->num = num;
pTemp->pNext =NULL;
if(!pHead)
{
pHead=pTemp;
}
else
{
pTail->pNext=pTemp;
}
pTail=pTemp;
printf("请输入一个数");
scanf("%d",&num);
}
//free(pTemp);
}
void ShowList()
{
LearList* pTemp = pHead;
while(pTemp)
{
printf("%d",pTemp->num);
pTemp = pTemp->pNext;
}
}
int main()
{
CreateList();
ShowList();
system("pause");
return 0;
}
------解决方案--------------------
去除构造析构来说,new是操作符,是编译器的东西 malloc是库函数,能看到代码……
------解决方案--------------------
malloc和free只负责分配和释放内存。
有关new和delete操作符看看下面这篇文章:
http://blog.csdn.net/xiexievv/article/details/8258237
------解决方案--------------------
CreateList()返回你的pTemp
main()函数返回之前 或者你确定你已经不再使用pTemp的地方释放
malloc/free就是单纯的申请释放内存
new/delete是操作符,这就意味着你可以重载
另外 new的用法大致可以分为3种:new表达式new operator,new操作符operator new,可以在已经申请的内存块上创建对象placement new
对于第3种比如
char *pTemp = (char *)malloc(sizeof(OBJ));
pTemp = new(pTemp)OBJ();
------解决方案--------------------
malloc 创建之后随时可以free 、但是你可以按需压来释放、最坏情况是在程序退去之前释放掉、也就是楼上说的main函数中return 0;之前 在下项目的情况下 根据创建对象的生命周期、不需要的时候释放! 像你这个程序 你可以单独写一个del函数来删除你、每次退去之前调用。你在man函数里面删除不能用一个简单的free来删除!
------解决方案--------------------
你的源代码中 free是在while之后也就是其实创建了很多pTemp 指针、但是你删除的之后最后一个 肯定是有问题的。。
正确的删除时根据你显示的那个方法获取每一个链表的节点指针 再一一删除!
------解决方案--------------------
将
malloc和free
象
fopen和fclose
那样用。