由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - vector析构的时候怎么办?
相关主题
一个C++的问题Random number generator in C++
vector的析构问题C++ rand()函数每次生成同一个数
c里面有什么函数可以COM本质论调用DLL里面构造函数的一点不解
关于 c malloc的一个问题Eclipse JNI问题, 拜谢
被ptmalloc坑了谁给详细说一下这句
map析构请问linklist的析构函数应该怎么写?
VC2005 C++ link error helpInterview question: is the following code OK?
multiple random number generator这个dtor为啥能被调用呢
相关话题的讨论汇总
话题: vector话题: 内存话题: c++话题: os话题: malloc
进入Programming版参与讨论
1 (共1页)
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 的大作中提到】
: 出栈的时候
相关主题
map析构Random number generator in C++
VC2005 C++ link error helpC++ rand()函数每次生成同一个数
multiple random number generatorCOM本质论调用DLL里面构造函数的一点不解
进入Programming版参与讨论
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算法。

相关主题
Eclipse JNI问题, 拜谢Interview question: is the following code OK?
谁给详细说一下这句这个dtor为啥能被调用呢
请问linklist的析构函数应该怎么写?strlen怎么实现的
进入Programming版参与讨论
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

1 (共1页)
进入Programming版参与讨论
相关主题
这个dtor为啥能被调用呢被ptmalloc坑了
strlen怎么实现的map析构
在 linux下有没有可能得到完全的fully static binaryVC2005 C++ link error help
一个面试题multiple random number generator
一个C++的问题Random number generator in C++
vector的析构问题C++ rand()函数每次生成同一个数
c里面有什么函数可以COM本质论调用DLL里面构造函数的一点不解
关于 c malloc的一个问题Eclipse JNI问题, 拜谢
相关话题的讨论汇总
话题: vector话题: 内存话题: c++话题: os话题: malloc