返回信息流rt
这是一条镜像帖。来源:北邮人论坛 / cpp / #75382同步于 2013/11/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
容器类数据存在堆上还是栈上?
starboy001
2013/11/27镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
【 在 starboy001 的大作中提到: 】
: rt
沙发真是信口开河。。
堆或栈都有;
一般说来,new/malloc的分配在堆上;
在局部作用域创建的对象分配在栈上,类似局部变量的创建/销毁;
因为计算机管理栈,因此栈对象相对安全;
Object *obj = new Object();// heap obj
Object obj();//stack obj
具体自己可以搜一下
我猜lz那意思是问容器类的元素存在堆上还是栈上。
如果我的猜测对的话,那可以说:基本可以认为存在堆上。
容器类构造时都有一个模板参数allocator,默认的实现是调用operator new和operator delete来申请和释放内存,所以在堆上。
但这并不阻止程序员实现自己的allocator,极端地说,我定义一个静态大数组,然后实现一个allocator在这个数组上分配和回收内存,那么使用这个allocator的容器类,其元素就存在栈上。
【 在 JacKie575 (小五哥) 的大作中提到: 】
: 沙发真是信口开河。。
: 堆或栈都有;
: 一般说来,new/malloc的分配在堆上;
: ...................
通过『我邮』发布
【 在 bupteinstein 的大作中提到: 】
: 我猜lz那意思是问容器类的元素存在堆上还是栈上。
: 如果我的猜测对的话,那可以说:基本可以认为存在堆上。
: 容器类构造时都有一个模板参数allocator,默认的实现是调用operator new和operator delete来申请和释放内存,所以在堆上。
: ...................
我对c++的更深层的内存分配模型没有理解到那么深的地步。。
我有个疑问:也就是假设在局部作用域创建一个vector<string> vs;vector本身是栈上对象;
创建与销毁都依赖于作用域;基本上我看到的代码中貌似没有手动删除vector中string的写法,也就是vector被销毁的时候,对其中每一个string“自动”调用了析构函数释放内存?
否则,不足以证明容器元素分配在堆中了,因为很明显内存泄露了;
Bingo!就是自动调用了析构函数。请参考http://cissco.iteye.com/blog/379093
简单来说,就是容器类负责,对其中的每一个元素,执行“申请内存、构造对象、析构对象、释放内存”的动作。
在你提到的例子vector<string>中,在vector的析构函数中,会逐一析构它管理的每一个string对象,然后释放它管理的(用以存放元素的)内存,然后析构自己的成员(基本就是几个指针)。
【 在 JacKie575 的大作中提到: 】
: 我对c++的更深层的内存分配模型没有理解到那么深的地步。。
: 我有个疑问:也就是假设在局部作用域创建一个vector<string> vs;vector本身是栈上对象;
: 创建与销毁都依赖于作用域;基本上我看到的代码中貌似没有手动删除vector中string的写法,也就是vector被销毁的时候,对其中每一个string“自动”调用了析构函数释放内存?
: ...................
【 在 bupteinstein 的大作中提到: 】
: Bingo!就是自动调用了析构函数。请参考http://cissco.iteye.com/blog/379093
: 简单来说,就是容器类负责,对其中的每一个元素,执行“申请内存、构造对象、析构对象、释放内存”的动作。
: 在你提到的例子vector<string>中,在vector的析构函数中,会逐一析构它管理的每一个string对象,然后释放它管理的(用以存放元素的)内存,然后析构自己的成员(基本就是几个指针)。
受教了,果然是我之前的说法不够严谨。。