关于STL容器存储对象的问题

xiaoma208 2003-04-18 12:30:11
请问如果我在STL容器存储的是对象,那么我在调用clear()或eara()的时候,会自动释放这个对象的内存空间吗?会执行该对象的析够函数吗?
...全文
62 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cppTrier 2003-04-19
  • 打赏
  • 举报
回复
STL的容器是基于by value语意的。当你把一个元素放入容器中,在容器中存放的实际上是这个元素的一个副本(这就是为什么STL容器要求元素必须可以拷贝构造和赋值),副本所占的内存是STL容器自己分配的,所以它会自己回收这些内存,同时调用元素的析构函数。

但是如果你把指针放到容器中,clear的时候容器只负责回收指针本身所占的内存,至于指针所指向的东西,它是不管。
messagebox 2003-04-19
  • 打赏
  • 举报
回复
vector中放的是什么,它就会自已析构什么
如果你放的是string *, vector管理的仅仅是这些指针的内存分配和回收,实际上它无法知道外面string对象是在哪分配的
cenphoenix 2003-04-19
  • 打赏
  • 举报
回复
我觉得它会对象的析构函数。
firela 2003-04-18
  • 打赏
  • 举报
回复
allocator::deallocate
void deallocate(pointer p, size_type n);
The member function frees storage for the array of n objects of type T beginning at p, by calling operator delete(p). The pointer p must have been earlier returned by a call to allocate for an allocator object that compares equal to *this, allocating an array object of the same size and type.

messagebox 2003-04-18
  • 打赏
  • 举报
回复
会,析构函数也会自动调用。
但如果存储的是对象的指针,外部对象如果是在堆上分配的,需要我们自已delete
woxihuanbohe 2003-04-18
  • 打赏
  • 举报
回复
应该是不会的!
你可以写一些代码测试一下!看看你clear()容器中的对象元素后,再去利用那些对象,看看是否出错!
messagebox 2003-04-18
  • 打赏
  • 举报
回复
to xorong(普渡众生)
那释放的是指针本身的空间,而外部对象的空间肯定没被释放的
疯狂的魔法 2003-04-18
  • 打赏
  • 举报
回复
to:messagebox(冷也好热也好活着就好)
vector<A*> vec(10) ;如同vector<long> vec(10) ;
你认为呢?
它会释放空间的
跟踪stl的源代码就知道了
一般都会析构函数的

messagebox 2003-04-18
  • 打赏
  • 举报
回复
因为STL不知道你插入的元素是从stack还是heap上分配的,只能由你自已决定
比如:class A {} ;
vector<A*> vec(10) ;
A a1 ;
A *a2 = new A ;
vec.push_back(&a1) ;
vec.push_back(a2) ;
delete a2 ;

zhouzicn 2003-04-18
  • 打赏
  • 举报
回复
指针指向的外部对象应该需要自己处理。
本身定义的可以自动处理,这正是STL容器的买点之一。
xiaoma208 2003-04-18
  • 打赏
  • 举报
回复
to messagebox:
请问能说说你的理由吗?或者那里有更详细的说明。。

24,853

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧