c++内存整理大师内存释放放的几种方法

c++中的内存分配方式有几种_百度知道
c++中的内存分配方式有几种
我有更好的答案
内存的三种分配方式:1. 从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储。2. 在栈区分配:相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限。3. 在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指定,灵活。但有内存泄露等问题。常见内存错误及对策1. 内存分配未成功,却被使用。对策:使用内存之前检查是否分配成功。用p!=NULL判断。2. 内存分配成功,未初始化就被使用。内存的缺省值没有统一的标准。大部分编译器以0作为初始值,但不完全是。对策:内存初始化时赋初值。3. 内存操作越界。对策:只能是小心了。4. 释放了内存,仍然使用。(1) 使用显示delete和free的野指针。对策:释放完内存,将指针置为NULL。(2) 使用隐式delete和free的野指针。主要是指函数返回指向栈内存的指针或引用。对策:当然是不要返回就可以了。5. 未释放内存,导致内存泄露。用new/malloc开辟了内存,没用delete/free释放.对策:new和delete的个数一定相同;malloc和free的个数一定相同;new[]和[]delete一定对应。
采纳率:51%
1)静态内存分配,全局变量等2)栈内存分配,函数的局部变量,返回值等3)动态内存分配,在程序里面随机申请的内存,new
你是想问,new()和malloc()吗。一个是分配原始的内存,一个是先分配内存,然后调用构造函数
为您推荐:
其他类似问题
内存分配的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。c++内存释放的几种方法_百度知道
c++内存释放的几种方法
我有更好的答案
在栈区分配:相关代码执行时创建,执行结束时被自动释放。在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。
采纳率:75%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。熟悉c++内存释放的进来
[问题点数:40分,结帖人a2057587]
本版专家分:0
结帖率 71.43%
CSDN今日推荐
本版专家分:86273
2011年3月 C/C++大版内专家分月排行榜第一2010年9月 C/C++大版内专家分月排行榜第一
2015年1月 C/C++大版内专家分月排行榜第二2012年3月 C/C++大版内专家分月排行榜第二2011年11月 C/C++大版内专家分月排行榜第二2010年6月 C/C++大版内专家分月排行榜第二2010年5月 C/C++大版内专家分月排行榜第二
2011年4月 C/C++大版内专家分月排行榜第三2011年2月 C/C++大版内专家分月排行榜第三2010年8月 C/C++大版内专家分月排行榜第三
本版专家分:30260
2008年7月 VC/MFC大版内专家分月排行榜第三2007年11月 VC/MFC大版内专家分月排行榜第三
本版专家分:57224
2011年6月 总版技术专家分月排行榜第三
2011年11月 专题开发/技术/项目大版内专家分月排行榜第一2011年10月 专题开发/技术/项目大版内专家分月排行榜第一2011年9月 专题开发/技术/项目大版内专家分月排行榜第一2011年8月 专题开发/技术/项目大版内专家分月排行榜第一2011年7月 专题开发/技术/项目大版内专家分月排行榜第一2011年6月 C/C++大版内专家分月排行榜第一
2011年7月 C/C++大版内专家分月排行榜第二2011年5月 专题开发/技术/项目大版内专家分月排行榜第二
2011年5月 C/C++大版内专家分月排行榜第三2008年1月 C/C++大版内专家分月排行榜第三2007年12月 C/C++大版内专家分月排行榜第三
本版专家分:57129
2011年4月 C/C++大版内专家分月排行榜第一
2012年8月 C/C++大版内专家分月排行榜第三2012年7月 C/C++大版内专家分月排行榜第三
本版专家分:57129
2011年4月 C/C++大版内专家分月排行榜第一
2012年8月 C/C++大版内专家分月排行榜第三2012年7月 C/C++大版内专家分月排行榜第三
本版专家分:5944
本版专家分:143
本版专家分:234
本版专家分:0
本版专家分:296
本版专家分:324
本版专家分:676
匿名用户不能发表回复!|
其他相关推荐
alamiye010朋友的将内存释放到底分享:
WPF/Silverlight应用程序长时间运行后会产生非常多的内存垃圾(内存泄露例外),特别是在经常需要进行Remove操作的粒子、动画、游戏等方面的应用,国外高手们提出的方案我归纳了一下主要有:
UIElement控
ppc软件 内存释放,ppc软件 内存释放,ppc软件 内存释放.
内存释放内存释放内存释放内存释放内存释放内存释放内存释放内存释放内存释放内存释放内存释放内存释放内存释放内存释放内存释放内存释放内存释放内存释放内存释放内存释放内存释放
C++中使用new和delete申请和释放内存空间,二者是成对出现的,缺一不可。使用new开辟的内存空间位于堆中,只能通过delete释放,这与局部变量不同,局部变量存储在栈中,变量生存周期结束后其内存也随之释放。
结构体中成员变量中存在指针的,其内存释放遵循从里向外的原则,即先释放成员变量的内存,然后在释放结构体指针。由于C++中允许结构体中使用构造函数和析构函数,构造函数对成员数据进行初
smartram内存释放
内存释放工具
sqlserver 内存释放
FreeMemory,内存释放
delphi_内存释放.............得之淡然,失之坦然,争其必然,顺其自然
关于C++中delete释放内存时效性问题
如需转载请标明出处:QQ技术交流群:测试示例:#include &iostream&
int main()
while(i--)
map=new int[20];
cout && map[i]&&//1
cout && map[i]&&//2
}结果:输出结果99887766554433221100疑问:delete释放之后,内容并不是立即回收的吗?解析:内存被释放后 表示这块儿内存可以被操作系统重新分配,但是指针还是指向这块儿内存的。虽然指针还是指向原来的位置,但是那一块内存随时都可能会被回收,因此输出的结果是具有不确定性的。所以我们在delete的同时 也要将指针置为NULL 这样在下一次调用该指针时,用if(NULL == p)才能判断出指针的状态,避免使用野指针。那么,delete之后能不能立即生效呢?答案肯定是可以的,不过这个也是和操作系统有关的。在Windows操作系统下,我们通过调用相关的Windows API即可立即让操作系统进行内存回收。// test.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include &iostream&
#include &windows.h&
#include &psapi.h&
#pragma comment(lib,"psapi.lib")
void showMemoryInfo(void)
HANDLE handle = GetCurrentProcess();
PROCESS_MEMORY_COUNTERS
GetProcessMemoryInfo(handle, &pmc, sizeof(pmc));
cout && "内存使用:" && pmc.WorkingSetSize / 1000 && "K/" && pmc.PeakWorkingSetSize / 1000 && "K + " && pmc.PagefileUsage / 1000 && "K/" && pmc.PeakPagefileUsage / 1000 && "K" &&
int main(int argc, char* argv)
showMemoryInfo();
cout && "回收所有可回收的内存" &&
EmptyWorkingSet(GetCurrentProcess());
showMemoryInfo();
cout && "开始动态分配内存" &&
char* buf[1];
for (int i = 0; i & sizeof(buf) / sizeof(char*); i++)
buf[i] = new char[102400];
showMemoryInfo();
cout && "开始释放内存" &&
for (int i = 0; i & sizeof(buf) / sizeof(char*); i++)
delete buf[i];
buf[i] = NULL;
showMemoryInfo();
cout && "回收所有可回收的内存" &&
EmptyWorkingSet(GetCurrentProcess());
showMemoryInfo();
}结论:delete之后只是程序告诉操作系统这一块内存我需要了,操作系统可以随时回收。至于什么时候回收这一块内存,就是和操作系统有关了,我们无法知道,或者会在很久后回收,或者因为比较着急会立即回收,是具有不确定性的。因此,在delete之后我们要养成立即将指针置为NULL的好习惯!觉得文章对你有帮助,可以用扫描二维码捐赠给博主,谢谢! 如需转载请标明出处:QQ技术交流群:
没有更多推荐了,在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
让我先描述下……
实现这样一个方法,删除不带头单链表中与val值相同的结点
方法签名:
ListNode* removeElements(ListNode* head, int val);
ListNode类声明
class ListNode {
ListNode(int x) : val(x), next(NULL) {}
ListNode *
逻辑很简单,当
pre-&next = p-&
之后,一般的做法是
但这时,有个问题。当主调函数中写如下调用时,会出内存问题
ListNode n0(0), n1(1), n2(2);
n0.next = &n1;
n1.next = &n2;
removeElements(&n0, 2);
n2结点的内存是不可delete的……
另外,如果在removeElements方法中不写delete逻辑,如果主调函数中,链表结点是new出来的,则不delete会内存泄露
So… 我想问一下,在实现类似的C++函数时,有什么一般的做法,或者业内默认规定?
或者,有没有更nice的处理方式?能让方法比较安全且避免内存泄露
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
既然有ListNode ,就应该有List类,将removeElements封装到List类中,由List类负责内存的分配和释放;
这样责任就清晰了。
再就是结点的分配一般都是在堆上申请,在栈上连接起来的结点当然无法删除;
如果非得需要按照你这样的实现,在栈上应用list,那么只用更改结点指针就好了,不用delete,栈上的即结点在退出程序逻辑范围时自动删除了;
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
最不动脑子的方法,用shared_ptr,当然在你这个问题中这样显得有点傻。
所以你应该把所有要删除的节点放到另外一个list里,等到真的不用的时候统一删掉就好。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你这种写法,不只是n2删除有问题,n0也有问题。
考虑在removeElements中对表头和表尾做特殊处理,双链表
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
可以考虑removeElements接口传入一个回调函数,让用户自己决定是否释放
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
谁提供的内存, 谁负责释放. 比如如果 Node是在你的类库代码里 分配的内存, 那么你的类库代码负责释放; 如果是用户 传入的内存, 则用户负责.
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。

我要回帖

更多关于 手机内存释放空间 的文章

 

随机推荐