关于堆中对象的释放问题

nblueguy 2003-06-30 03:37:35
堆中分配的内存如何释放空间。
如果在栈中动态分配对象,那么这个对象随着这个函数SCOPE结束就释放了?还是就指针变量空间释放了,但是对象的内存空间还在,那么一定要定义一个全局的指针变量?
希望能得到HELP.
...全文
92 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
byyyyy 2003-06-30
  • 打赏
  • 举报
回复
有点明白了,谢谢各位!
cy214 2003-06-30
  • 打赏
  • 举报
回复
我觉得动态创建对象主要是非常的灵活 对象实体都在堆中
我们通过指针就可以灵活的对它们操作
关于生命期 不用了就delete...
nblueguy 2003-06-30
  • 打赏
  • 举报
回复
up!可能我表达不清楚,我再来写一下。
A。什么时候要用到堆内存分配?
 1.分配大块内存地址。
2.动态创建对象的情形,不能确定要生成多少对象的情况下。
还有么?
B。动态创建对象如何来控制对象的生命周期,大家是 如何处理得?
谢谢!!!!!!~~
cy214 2003-06-30
  • 打赏
  • 举报
回复
可以往函数里传参数 或者通过函数的返回值来得到函数中创建对象的地址
nblueguy 2003-06-30
  • 打赏
  • 举报
回复
谢谢大家回答,分数我会狂加的!!:)

我的理解是,stack 中分配的内存(包括普通变量和对象变量)由系统自己来决定生命周期(由{}定义的范围)而heap中分配的内存的生命周期是由用户自己来决定的!
我的意思是:
那么如果我在函数(stack)中动态分配内存(heap)的对象或则普通变量怎么管理他们的生命期!~
如:
void MyFunction()
{
int i = 5; // 堆栈中的本地(自动)变量
int *iArray; // 堆栈中的本地(自动)变量
CobjTemp *objTmp= new CobjTemp();// 在堆中分配内存!
//do something.
}
那么objTemp是指向CobjTemp大小的内存空间.但是objTemp在这里随着MyFunction的范围结束而生命期结束。那么这个new 的堆内存空间就会出现内存泄露?我们没办法来释放它!!
所以要定义一个全局的变量来控制,
CArray arrTemp;
void MyFunction()
{
int i = 5; // 堆栈中的本地(自动)变量
int *iArray; // 堆栈中的本地(自动)变量
CobjTemp *objTmp= new CobjTemp();// 在堆中分配内存!
arrTemp.Add(objTemp);
}
这样我还可以控制住这个objTemp所在的内存空间。不知道大家是怎么来处理的。
如果我有个函数是用来动态生成飞机对象的,根据实际的情况来生成飞机。那么我要有一个全局的集合对象来管理他们,比如CaircraftCarrier 来管理,不知道大家是如何处理?如果只有一个对象,那么我就直接定义为全局变量了,我总是决定这个动态性不够。

另外,很同意

free_card(痛并快乐着)
//
//所以本文问题的答案是:使用堆栈(stack)分配本地或者局域变量的地址空间,而用堆
//(heap)分配大块内存地址或者动态创建对象的情形。
ForFar 2003-06-30
  • 打赏
  • 举报
回复
在delete一个指针后,最好再赋给该指针一个空值。防止出现"野指针"。
比如:delete pointer;
pointer = NULL;
free_card 2003-06-30
  • 打赏
  • 举报
回复
在Window中执行的每一个应用程序都有其自己的内存地址。一部分内存空间用于存放程序代码,一部分内存空间用于存放程序执行期间
创建的变量。创将变量的方法有两种,一种是在堆中,另外一种则在堆栈里。

理解堆的最好的方法是将它看成一个程序随时可以使用的内存块。为了创建堆变量,程序要使用“new”(在C++里)操作符或者
“malloc”(在C中)例程,它们返回指向变量的指针(堆变量总是通过指针来处理和操作)。最后程序用“delete”(在C++里)操作符
或者“free”(在C中)例程来删除或者释放内存空间。

而堆栈则不同,它是某个函数被调用后随时可以创建的一小块内存,被用于在函数范围内保存变量(也称为自动变量)。在函数中,任何
包含在{}内的代码都有其自己的堆栈。当这个函数或者{}退出时,堆栈以及它包含的所有内容都被摧毁。因此下面的代码是不运行的:


void Myfunction()
{
int i = 5;

{
int j = 6;
}

int k = i+j;
}

所以本文问题的答案是:使用堆栈(stack)分配本地或者局域变量的地址空间,而用堆(heap)分配大块内存地址或者动态创建对象的情形。
例如:

void MyFunction()
{
int i = 5; // 堆栈中的本地(自动)变量
int *iArray; // 堆栈中的本地(自动)变量

iArray = new int[10000]; // 这一行代码将在堆中创建10000个元素的数组,由iArray指向其地址

for (int k = 0; k < 10000 ; k++)
{
iArray[k] = k + i;
cout << iArray[k] << "\n";
}

delete iArray; // 从堆中删除或释放数组占用的地址空间,否则将会有内存泄漏


} //函数结束

注意:iArray 不是一个堆变量。它是一个局部指针变量,指向堆中未命名的一个数组
xhjbeidoulong 2003-06-30
  • 打赏
  • 举报
回复
栈中动态分配对象,那么这个对象随着这个函数SCOPE结束就释放了。
它是这样实现在(这里假定一个动态对象):进入函数时,栈指针向上移一个对象大小,这时在这个函数内就可以操作这个对象了,当函数退出时,栈指针又移回原处,这样这个空间就不可确定了,如果这个空间未被覆盖过,那么应该还是可以通过指针来访问的。
Linux2001 2003-06-30
  • 打赏
  • 举报
回复
new分配的就用delete释放
malloc分配的内存就用free释放

16,473

社区成员

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

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

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