s*****g 发帖数: 5159 | 1 前来天请教过vector,当时记得有人说vector不用初始化也不用析构。我现在出现内存
占用比想象的大很多,所以请教一下具体情况。
class A{
private:
vector val;
public:
A();
AddValue(int m){
val.push_back(m);
};
~A(){};
}
调用:
A a;
for(long i = 0; i<1000000000; i++)
a.AddValue(10); |
z****e 发帖数: 2024 | 2 不需要delete a, ~A(){}时候,vector自动化解。
你这个每次都push一下,的确比较慢。
事先reserve()比较好。 |
s*****g 发帖数: 5159 | 3 如果我不delete &a的话,~A(){}什么时候被调用呢?
【在 z****e 的大作中提到】 : 不需要delete a, ~A(){}时候,vector自动化解。 : 你这个每次都push一下,的确比较慢。 : 事先reserve()比较好。
|
h****8 发帖数: 599 | 4 程序结束时,a生命结束,系统调用析构。
难道你认为一定要显式调用析构才行么
【在 s*****g 的大作中提到】 : 如果我不delete &a的话,~A(){}什么时候被调用呢?
|
s*****g 发帖数: 5159 | 5 我的情况是这样的
for(int i=0; i<100; i++){
A a;
for(long j=0; j<10000000000; j++)
a.AddValue(10);
}
这种情况下,a是什么时候析构的呢?语言是C++。
【在 h****8 的大作中提到】 : 程序结束时,a生命结束,系统调用析构。 : 难道你认为一定要显式调用析构才行么
|
N***m 发帖数: 4460 | 6 临时变量,跳出内循环的时候自动销毁
【在 s*****g 的大作中提到】 : 我的情况是这样的 : for(int i=0; i<100; i++){ : A a; : for(long j=0; j<10000000000; j++) : a.AddValue(10); : } : 这种情况下,a是什么时候析构的呢?语言是C++。
|
h****8 发帖数: 599 | 7 出栈的时候
【在 s*****g 的大作中提到】 : 我的情况是这样的 : for(int i=0; i<100; i++){ : A a; : for(long j=0; j<10000000000; j++) : a.AddValue(10); : } : 这种情况下,a是什么时候析构的呢?语言是C++。
|
s*****g 发帖数: 5159 | 8 多谢。
【在 N***m 的大作中提到】 : 临时变量,跳出内循环的时候自动销毁
|
s*****g 发帖数: 5159 | 9 多谢,我只是举个例子,实际操作有所变化。
【在 z****e 的大作中提到】 : 不需要delete a, ~A(){}时候,vector自动化解。 : 你这个每次都push一下,的确比较慢。 : 事先reserve()比较好。
|
s*****g 发帖数: 5159 | 10 这个回答比较哲学。我可不可以这么理解,退出for循环的时候就应该释放,但是如果
内存管理知道还有
大量的物理内存可用,就延缓释放,直到程序结束或者内存不够的时候在释放?
【在 h****8 的大作中提到】 : 出栈的时候
|
|
|
S**I 发帖数: 15689 | 11 你这说的是garbage collection,C++里没这个。
【在 s*****g 的大作中提到】 : 这个回答比较哲学。我可不可以这么理解,退出for循环的时候就应该释放,但是如果 : 内存管理知道还有 : 大量的物理内存可用,就延缓释放,直到程序结束或者内存不够的时候在释放?
|
r****t 发帖数: 10904 | 12 destroy objects != freeing memory to OS. Runtime can hold onto the
memory of it sees necessary.
【在 s*****g 的大作中提到】 : 这个回答比较哲学。我可不可以这么理解,退出for循环的时候就应该释放,但是如果 : 内存管理知道还有 : 大量的物理内存可用,就延缓释放,直到程序结束或者内存不够的时候在释放?
|
h****8 发帖数: 599 | 13 每次for 循环体执行完一次,就释放。因为Local temp生命期结束了
你这个A又不是分配在堆上的
【在 s*****g 的大作中提到】 : 这个回答比较哲学。我可不可以这么理解,退出for循环的时候就应该释放,但是如果 : 内存管理知道还有 : 大量的物理内存可用,就延缓释放,直到程序结束或者内存不够的时候在释放?
|
z****e 发帖数: 2024 | 14 楼主以前用java吗?
我是完全不会java。
楼主java到什么境界了? |
s*****g 发帖数: 5159 | 15 看了这个加上其他大牛回答我就明白了。
曾经编过一个指数空间程序,内存占用应该是从2^1逐步升到2^n在逐步降回2^1,但是
在资源监测程序
ganglia看到的是从2^1升到2^n然后保持在2^n,最后程序结束的时候一并收回,就是这
种情况。
这也就是为什么我要问内存确切什么时候回收。我再去仔细查查我的程序。我的程序是
个weak
polynomial time and space算法。
【在 r****t 的大作中提到】 : destroy objects != freeing memory to OS. Runtime can hold onto the : memory of it sees necessary.
|
s*****g 发帖数: 5159 | 16 这个我知道。你误会了。
【在 S**I 的大作中提到】 : 你这说的是garbage collection,C++里没这个。
|
s*****g 发帖数: 5159 | 17 我以前是用C的,C++的理解停留在C++标准制定以前的水平,99年本科学的,那时候没
教STL,应该是当
时刚刚确定STL的标准。
我这个蹩脚C++程序员学的,如果构造函数有
new / malloc
析构就要自己写
delete / free
一个类的实例用完以后要delete其指针。
这些年做算法研究一下落伍了,这些新的STL需要找工作了才重新学。汗颜啊。
【在 z****e 的大作中提到】 : 楼主以前用java吗? : 我是完全不会java。 : 楼主java到什么境界了?
|
z****e 发帖数: 2024 | 18 "这些年做算法研究一下落伍了"
太搞了吧?这站在科研最前线都叫落伍了?
【在 s*****g 的大作中提到】 : 我以前是用C的,C++的理解停留在C++标准制定以前的水平,99年本科学的,那时候没 : 教STL,应该是当 : 时刚刚确定STL的标准。 : 我这个蹩脚C++程序员学的,如果构造函数有 : new / malloc : 析构就要自己写 : delete / free : 一个类的实例用完以后要delete其指针。 : 这些年做算法研究一下落伍了,这些新的STL需要找工作了才重新学。汗颜啊。
|
s*****g 发帖数: 5159 | 19 应该说我落伍了,和算法无关。
老板要求严格测量算法实际的执行时间,所以一直只用数组、指针、malloc、free。我
做的组合问题这
些就够用了,就一直没学STL。现在发现不行了。
【在 z****e 的大作中提到】 : "这些年做算法研究一下落伍了" : 太搞了吧?这站在科研最前线都叫落伍了?
|
B*******g 发帖数: 1593 | 20 好像STL有些container分配内存是chunk by chunk的 比如一开始1000 bytes, 你需要
地1001
byte的话就再分配1000 b 总共2000 bytes..你即使pop了,内存地址指向的数据变得无
效,但是
系统认为你可能会再用到这部分空间,所以并不回收内存;动态分配内存的cost很高
【在 s*****g 的大作中提到】 : 看了这个加上其他大牛回答我就明白了。 : 曾经编过一个指数空间程序,内存占用应该是从2^1逐步升到2^n在逐步降回2^1,但是 : 在资源监测程序 : ganglia看到的是从2^1升到2^n然后保持在2^n,最后程序结束的时候一并收回,就是这 : 种情况。 : 这也就是为什么我要问内存确切什么时候回收。我再去仔细查查我的程序。我的程序是 : 个weak : polynomial time and space算法。
|
|
|
z***e 发帖数: 5393 | 21 我比较怀疑,这又不是java/.NET,OS自己可以对memory有算法优化,毕竟也就是page
allocation问题,但是如果你“监测”到内存始终在2^n,那绝对是内存没释放。
当然,也可能是C++那些allocator的原因。如果是C,free了就free了。
程序结束时肯定全部收回,你靠这个判断是不对的。
【在 s*****g 的大作中提到】 : 看了这个加上其他大牛回答我就明白了。 : 曾经编过一个指数空间程序,内存占用应该是从2^1逐步升到2^n在逐步降回2^1,但是 : 在资源监测程序 : ganglia看到的是从2^1升到2^n然后保持在2^n,最后程序结束的时候一并收回,就是这 : 种情况。 : 这也就是为什么我要问内存确切什么时候回收。我再去仔细查查我的程序。我的程序是 : 个weak : polynomial time and space算法。
|
s*****g 发帖数: 5159 | 22 我用的是new和delete,不是malloc和free,编译器是g++ 4.xx,操作系统是CentOS 5.
3 x64。
内存的确是释放了,我反复查过了,内存也不是始终在2^N,整个程序执行大概40分钟
,再最后还有2分钟
的时候,这2^n的内存释放了大概 1/2,最后结束的时候全部释放。
见图。
page
【在 z***e 的大作中提到】 : 我比较怀疑,这又不是java/.NET,OS自己可以对memory有算法优化,毕竟也就是page : allocation问题,但是如果你“监测”到内存始终在2^n,那绝对是内存没释放。 : 当然,也可能是C++那些allocator的原因。如果是C,free了就free了。 : 程序结束时肯定全部收回,你靠这个判断是不对的。
|
t****t 发帖数: 6806 | 23 你怀疑错了.
page
【在 z***e 的大作中提到】 : 我比较怀疑,这又不是java/.NET,OS自己可以对memory有算法优化,毕竟也就是page : allocation问题,但是如果你“监测”到内存始终在2^n,那绝对是内存没释放。 : 当然,也可能是C++那些allocator的原因。如果是C,free了就free了。 : 程序结束时肯定全部收回,你靠这个判断是不对的。
|
t****t 发帖数: 6806 | 24 new/delete和malloc/free在OS看来没区别.
5.
【在 s*****g 的大作中提到】 : 我用的是new和delete,不是malloc和free,编译器是g++ 4.xx,操作系统是CentOS 5. : 3 x64。 : 内存的确是释放了,我反复查过了,内存也不是始终在2^N,整个程序执行大概40分钟 : ,再最后还有2分钟 : 的时候,这2^n的内存释放了大概 1/2,最后结束的时候全部释放。 : 见图。 : : page
|
z***e 发帖数: 5393 | 25 难道说free之后那块内存还实际上没被free?我知道OS会mark那块内存放个标志什么的
,不见得会立刻放到available可以立刻alloc的内存里面去,等到某个时候再处理。但
是这块内存并不是还在"in use"啊。
打个比方,debug的话, delete了一个pointer,那块部分就标成了FFFFFF之类的东西表
示已经不可用了,这部分显然不会马上分配给其他new/malloc,但是也不算仍然占用的
吧?
老大,有空解释一下吧。
【在 t****t 的大作中提到】 : 你怀疑错了. : : page
|
t****t 发帖数: 6806 | 26 there are 2 levels of "allocation": allocation within the process, aka
memory/heap management, corresponding to section 3 of man pages; and
allocation from the OS, aka data segment size increase/decrease and memory
mapping, corresponding to section 2 of man pages.
the first part is a direct mapping of libc API: malloc()-allocate, free()-
release. If in the process of malloc, the heap runs out of space, or some
other condition triggers, the libc will invoke the 2nd part automatically.
this depend
【在 z***e 的大作中提到】 : 难道说free之后那块内存还实际上没被free?我知道OS会mark那块内存放个标志什么的 : ,不见得会立刻放到available可以立刻alloc的内存里面去,等到某个时候再处理。但 : 是这块内存并不是还在"in use"啊。 : 打个比方,debug的话, delete了一个pointer,那块部分就标成了FFFFFF之类的东西表 : 示已经不可用了,这部分显然不会马上分配给其他new/malloc,但是也不算仍然占用的 : 吧? : 老大,有空解释一下吧。
|
s*****g 发帖数: 5159 | 27 前辈是南开电子的?
memory
free()-
some
automatically.
free(),
on
【在 t****t 的大作中提到】 : there are 2 levels of "allocation": allocation within the process, aka : memory/heap management, corresponding to section 3 of man pages; and : allocation from the OS, aka data segment size increase/decrease and memory : mapping, corresponding to section 2 of man pages. : the first part is a direct mapping of libc API: malloc()-allocate, free()- : release. If in the process of malloc, the heap runs out of space, or some : other condition triggers, the libc will invoke the 2nd part automatically. : this depend
|
t****t 发帖数: 6806 | 28 ft, why? i am not.
【在 s*****g 的大作中提到】 : 前辈是南开电子的? : : memory : free()- : some : automatically. : free(), : on
|
s*****g 发帖数: 5159 | 29 我看到你签名档里的“多隆”就想起了一个古老的社团。
看来多隆是个常见词。
t
【在 t****t 的大作中提到】 : ft, why? i am not.
|
z***e 发帖数: 5393 | 30 ok, got it. thanks.
i think that's why Windows also has APIs like VirtualAlloc and other
confusing calls :)
【在 t****t 的大作中提到】 : there are 2 levels of "allocation": allocation within the process, aka : memory/heap management, corresponding to section 3 of man pages; and : allocation from the OS, aka data segment size increase/decrease and memory : mapping, corresponding to section 2 of man pages. : the first part is a direct mapping of libc API: malloc()-allocate, free()- : release. If in the process of malloc, the heap runs out of space, or some : other condition triggers, the libc will invoke the 2nd part automatically. : this depend
|