关于动态内存分配释放的问题, 百思不得其解, 恳请高手指教

welkin_qiu 2002-04-03 10:37:40
函数 A 中动态分配了一块内存, 并返回指向此内存块的指针,
函数 B 中调用 A 得到此指针, 当用完后不再需要此内存块或
是函数退出后, 由 A 分配的这块内存是如何释放的呢?

是由系统自动释放还是要在 B 中显式地用 delete 完成呢.
特别当 A 中的内存块不是用 new 分配而是直接用数组预定义
好的如 char ar[200]; return ar; 这样, 那又该如何释放此内
存呢?

真是百思不得其解, 恳请高手指点!


#include <stdlib.h>
#include <iostream>

char* A()
{
char *str = new char[200]; //动态分配了200字节内存
//或者 char str[200];

strcpy(str, "hello");
return str; //返回指向此内存指针
}

void B()
{
char *p;
p = A(); //得到内存块指针
std::cout << p << std::endl;

p = "test ...";
//这个时候, p原先指向的内存是否会自动释放呢? 还是要在此语名前显式加上
//delete [] p; 语句, 如果不会自动释放, 那就会造成内存泻漏, 为什么我在
//所有的书上都没有看到过有这样显式用 delete 释放的,
//
//又如果内存会在无指针指向时自动释放, 那岂不是绝大多数delete语句也就
//意义不大了(除了对内存空间有特别需求), 反正系统会自动释放?
//
//更特别如果 A 中的内存不是由new分配而是由数组显未定义得来如
//char str[200]; , 那这时又是如何释放内存的呢?

return;
}


int main(int argc, char* argv[])
{
B();
return 0;
}

...全文
96 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sr71 2002-04-03
  • 打赏
  • 举报
回复
在函数之间传递这样的指针主要是为提高效率.想象一下把一个大结构用传值方式传来传去,还要拷贝其成员...
当然在函数A中new的东东,而在函数B中调用了其指针之后切记用delete杀之.换言之只要模块间互相调用时注意接口的一致性和完整性应该能做到效率和可靠两不误.
至于所定义的局部数组根本不属于动态分配.
springleo 2002-04-03
  • 打赏
  • 举报
回复
局部变量使用的是栈内存,如CBitmap bitmap;
动态内寸分配使用的是堆内存,如:
CBitmap *pBmp;
pBmp=new CBitmap;
....
delete pBmp;
那么两种方法究竟那种好呢?
wpmsoft 2002-04-03
  • 打赏
  • 举报
回复
最好这样:
函数B:
char *p = new char[200];
memset(p,0,200);
A(p);
return;

而函数A:
void A(char *p)
{
memset(p,1,10);
return;
}

注意不要越界哟!!要不,再加上一个int nCount的参数,呵呵。。。
wpmsoft 2002-04-03
  • 打赏
  • 举报
回复
你提供的程序本身是错误的,而且很严重,就象上面的朋友说的,你会死得很惨!!

用new 分配的内存需要用delete释放,而且最好放在同一段代码空间内,这样逻辑性较强。

局部的数组不需要而且也不能delete,当其作用域终结时,其所占用的空间自然会释放掉。

不要拘泥于教科书。书上只不过是为你阐明了一个编程思想而已。

例子中所提到的问题完全可以用另一种方式(函数调用,参数,返回等)来实现,你应该会了吧?
dingkl 2002-04-03
  • 打赏
  • 举报
回复
用new 分配的内存需要用delete释放,如果定义的局部数组,函数调用了就不存在了,不能返回。
连环炮 2002-04-03
  • 打赏
  • 举报
回复
只要是用new分配的内存,在什么地方delete都可以。如果定义的局部数组,函数调用了就不存在了,根本不允许你返回,对其操作只能让程序崩溃。
lyneville 2002-04-03
  • 打赏
  • 举报
回复
在调用函数中删除
welkin_qiu 2002-04-03
  • 打赏
  • 举报
回复
听君一席话,胜读十天书,谢谢各位啦。
e_notimpl 2002-04-03
  • 打赏
  • 举报
回复
返回char xx[200]会死得很惨的。
welkin_qiu 2002-04-03
  • 打赏
  • 举报
回复
书上有讲过凡 new 的一定要 delete, 但那都是在同一个函数或类中才有,
至于跨函数的就一个也没有讲过.

象下面这个例子是很多书中都有类似的
char *p;
p = A();
p = B();
p = C();
的语句, 为什么所有的教学例子里都没有提过要用delete释放内存, 要知道当写一个大型服务器程序时, 很容易就耗光所有内存的?

quengzi 2002-04-03
  • 打赏
  • 举报
回复
char *str = new char[200]; //动态分配了200字节内存

delete []str,new --->delete (must)
ahao 2002-04-03
  • 打赏
  • 举报
回复
好好看看书吧
你看的书没有一本提到delete???
想必是很烂的书
ourworld 2002-04-03
  • 打赏
  • 举报
回复
凡是new出来的必定要delete,而在函数中,声明char xx[200]是不要显式释放的(不要delete),因为它的物理空间在堆栈中,函数返回时自动清除
icecools 2002-04-03
  • 打赏
  • 举报
回复
由B来delete
char arr[200]这样大概不要自己释放吧
kissfire 2002-04-03
  • 打赏
  • 举报
回复
关注,请继续!

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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