关于堆中对象的释放问题 堆中分配的内存如何释放空间。如果在栈中动态分配对象,那么这个对象随着这个函数SCOPE结束就释放了?还是就指针变量空间释放了,但是对象的内存空间还在,那么一定要定义一个全局的指针变量?希望能得到HELP. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 new分配的就用delete释放malloc分配的内存就用free释放 栈中动态分配对象,那么这个对象随着这个函数SCOPE结束就释放了。它是这样实现在(这里假定一个动态对象):进入函数时,栈指针向上移一个对象大小,这时在这个函数内就可以操作这个对象了,当函数退出时,栈指针又移回原处,这样这个空间就不可确定了,如果这个空间未被覆盖过,那么应该还是可以通过指针来访问的。 在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 不是一个堆变量。它是一个局部指针变量,指向堆中未命名的一个数组 在delete一个指针后,最好再赋给该指针一个空值。防止出现"野指针"。比如:delete pointer; pointer = NULL; 谢谢大家回答,分数我会狂加的!!:)我的理解是,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)分配大块内存地址或者动态创建对象的情形。 up!可能我表达不清楚,我再来写一下。A。什么时候要用到堆内存分配? 1.分配大块内存地址。 2.动态创建对象的情形,不能确定要生成多少对象的情况下。还有么?B。动态创建对象如何来控制对象的生命周期,大家是 如何处理得?谢谢!!!!!!~~ 我觉得动态创建对象主要是非常的灵活 对象实体都在堆中我们通过指针就可以灵活的对它们操作关于生命期 不用了就delete... 急救!!runtime error!! manifest 引起的绘图异常 紧急求助:用vc时下你的fft2,怎么和用matlab中的fft2函数得出的结果不一样呢?? 求一个smtp发送邮件的例子 在客户区再"贴"上一个窗口的问题 用VC开发网络通信ActiveX控件 熟悉ADO和ORACLE的朋友帮忙啊,急急急急!!!!1 createprocess问题 图像伪彩色 求传真软件源代码 怎样知道本地某个端口与哪个外地IP建立了连接? 请问浮点数的问题
malloc分配的内存就用free释放
它是这样实现在(这里假定一个动态对象):进入函数时,栈指针向上移一个对象大小,这时在这个函数内就可以操作这个对象了,当函数退出时,栈指针又移回原处,这样这个空间就不可确定了,如果这个空间未被覆盖过,那么应该还是可以通过指针来访问的。
创建的变量。创将变量的方法有两种,一种是在堆中,另外一种则在堆栈里。理解堆的最好的方法是将它看成一个程序随时可以使用的内存块。为了创建堆变量,程序要使用“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 不是一个堆变量。它是一个局部指针变量,指向堆中未命名的一个数组
比如:delete pointer;
pointer = NULL;
我的意思是:
那么如果我在函数(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)分配大块内存地址或者动态创建对象的情形。
A。什么时候要用到堆内存分配?
1.分配大块内存地址。
2.动态创建对象的情形,不能确定要生成多少对象的情况下。
还有么?
B。动态创建对象如何来控制对象的生命周期,大家是 如何处理得?
谢谢!!!!!!~~
我们通过指针就可以灵活的对它们操作
关于生命期 不用了就delete...