社区
工具平台和程序库
帖子详情
vector在发生内存重新分配时,会对原有的元素调用析构函数吗?
nbb
2003-12-07 02:05:00
vector在发生内存重新分配时,会重新分配内存,并拷贝原有的元素到新内存区,然后删除原有的内存,那么它会对这些原来的元素调用析构函数吗?
...全文
250
9
打赏
收藏
vector在发生内存重新分配时,会对原有的元素调用析构函数吗?
vector在发生内存重新分配时,会重新分配内存,并拷贝原有的元素到新内存区,然后删除原有的内存,那么它会对这些原来的元素调用析构函数吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
begginginstorm
2003-12-08
打赏
举报
回复
写成这样可能更好理解:
class Foo
{
static int iCount ;
int id;
public:
Foo(){ ++iCount; id = iCount; cout<<"Foo()\t"<<iCount<<endl; }
Foo(const Foo& copy)
{
this->id = copy.id;
cout << "Copy construction, id:" << this->id << endl;
}
~Foo(){ cout<<"~Foo()\t"<<id<<endl; }
};
int Foo::iCount = 0;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
vector< Foo > fv;
fv.reserve(1);
Foo f1,f2,f3;
cout << "Insert first:" << endl;
fv.push_back(f1);
cout << "Insert second:" << endl;
fv.push_back(f2);
cout << "Insert third:" << endl;
fv.push_back(f3);
cout << "Operation has completed" << endl;
return 0;
}
输出结果:
Foo() 1
Foo() 2
Foo() 3
Insert first:
Capacity:1
Copy construction, id:1
Insert second:
Capacity:1
Copy construction, id:1
Copy construction, id:2
~Foo() 1
Insert third:
Capacity:2
Copy construction, id:1
Copy construction, id:2
Copy construction, id:3
~Foo() 1
~Foo() 2
Operation has completed
~Foo() 3
~Foo() 2
~Foo() 1
~Foo() 1
~Foo() 2
~Foo() 3
可以看出vector在发现自身空间不足时,首先申请了一块更大的空间(一般2倍),然后调用拷贝构造函数拷贝已有元素,然后调用析构释放存在于小空间上的元素。
如果你的元素没有特别的要求,那么不必提供拷贝构造,这是编译器会自动为你生成一个bit-wise的拷贝构造函数,也就是按位拷贝(浅拷贝);如果你的元素内部有比较特殊的成员变量(比如handle,指针,智能指针之类等),那你就必须根据这些特殊的成员变量提供一个适合自己的拷贝构造函数,以防止在拷贝构造/析构的过程中信息丢失或数据错误。
Yssss1980
2003-12-08
打赏
举报
回复
由此可见reserve函数确实有用
把reserve(1)改为reserve(3),结果是这样的
/**result:
Foo() 1
Foo() 2
Foo() 3
Foo() 4
Foo() 5
Foo() 6
~Foo() 3
~Foo() 2
~Foo() 1
~Foo() 4
~Foo() 5
~Foo() 6
*/
Yssss1980
2003-12-08
打赏
举报
回复
把楼上程序改了改,增加了一个拷贝ctor,发现居然一共产生了9个Foo
#include <vector>
#include <iostream>
using namespace std;
class Foo
{
static int iCount ;
int id;
public:
Foo(){ ++iCount; id = iCount; cout<<"Foo()\t"<<iCount<<endl; }
Foo(const Foo & other){++iCount; id = iCount; cout<<"Foo()\t"<<iCount<<endl;}
~Foo(){ cout<<"~Foo()\t"<<id<<endl; }
};
int Foo::iCount = 0;
int main()
{
vector< Foo > fv;
fv.reserve(1);
Foo f1,f2,f3;
fv.push_back(f1);
fv.push_back(f2);
fv.push_back(f3);
return 0;
}
/**result:
Foo() 1
Foo() 2
Foo() 3
Foo() 4
Foo() 5
Foo() 6
~Foo() 4
Foo() 7
Foo() 8
Foo() 9
~Foo() 5
~Foo() 6
~Foo() 3
~Foo() 2
~Foo() 1
~Foo() 7
~Foo() 8
~Foo() 9
*/
cityyokel
2003-12-07
打赏
举报
回复
#include <vector>
#include <iostream>
using namespace std;
class Foo
{
static int iCount ;
int id;
public:
Foo(){ ++iCount; id = iCount; cout<<"Foo()\t"<<iCount<<endl; }
~Foo(){ cout<<"~Foo()\t"<<id<<endl; }
};
int Foo::iCount = 0;
int main()
{
vector< Foo > fv;
fv.reserve(1);
Foo f1,f2,f3;
fv.push_back(f1);
fv.push_back(f2);
fv.push_back(f3);
return 0;
}
结果是:
Foo() 1
Foo() 2
Foo() 3
~Foo() 1
~Foo() 2
~Foo() 1
~Foo() 2
~Foo() 3
~Foo() 3
~Foo() 2
~Foo() 1
~Foo() 1
~Foo() 2
~Foo() 3
看一下就知道了吧
Wolf0403
2003-12-07
打赏
举报
回复
因为没有传说中的 move-ctor,vector 的内存重新分配过程(一般是分配一块 1.5 倍大小的空间),然后用 copy-ctor + dtor 进行复制。
nbb
2003-12-07
打赏
举报
回复
偶也同意sakurar的观点,可是偶接触的标准库好像是要调用的! 真TMD的不爽: 偶在容器的元素中分配了HANDLE,在析构时释放,如果扩容时要对原元素调用析构函数,偶的HANDLE就完了!
sakurar
2003-12-07
打赏
举报
回复
为什么不亲自试试?!
我认为这种扩容不会调用构析函数。如果是我写这个容器,我情愿把是否释放的权利交给用户来决定。而且的确也没必要进行释放。因为你不知道调用一个未知类型的析构函数会发生什么。
想不调构析函数就释放了内存那还不容易?作为模板容器,直接申请与释放基础类型的、所需要尺寸的内存段就是了。
ntxs
2003-12-07
打赏
举报
回复
同意楼上
nirvana_li
2003-12-07
打赏
举报
回复
vector发生内存重新分配的时候,先建立一个比原有内存单元大2倍的内存单元,然后把原有的vector的一个副本拷贝到新的内存单元中,然后将原有的内存单元撤消,这个动作应该会调用它的析构函数,不然怎么消除原来的内存单元呢?
vector
用erase删除
元素
时
,为什么被删
元素
的
析构函数
会
被
调用
更多次?
vector
用erase删除
元素
时
,为什么被删
元素
的
析构函数
会
被
调用
更多次? 分类: C++2011-08-18 14:55 720人阅读 评论(0) 收藏 举报
vector
iteratorexceptiondeletestringdestructor
vector
::erase的原型如下: iterator erase(iterator position);
[C++]
vector
内存
分配与释放机制
vector
相关函数 size():
vector
当前拥有的
元素
个数 capacity():
vector
在必须分配新存储空间之前可以存储
元素
总数 创建完
vector
之后,size和capacity都为0,但是向
vector
插入
元素
之后,
会
发生
变化,通常capacity大于等于size,这是
vector
内存
增长机制决定的 push_back():向
vector
最后插入一个
元素
,在
调用
push_back
时
,若当前的capacity已经不能够放入新的
元素
(capacity=size),那么
vector
会
C++
析构函数
实战详解
摘要:本文系统讲解了C++
析构函数
的核心作用与最佳实践。通过动态数组管理案例,揭示了未定义
析构函数
导致的
内存
泄漏问题;引入"三法则"解决拷贝
时
的双重释放问题;在多态继承场景中,强调基类虚
析构函数
对派生类资源释放的关键作用。最后建议使用智能指针实现自动化资源管理。全文通过递进的代码示例,完整展现了资源生命周期的管理艺术。(150字)
C++ STL中的
vector
的
内存
分配与释放
1.
vector
的
内存
增长
vector
其中一个特点:
内存
空间只
会
增长,不
会
减小,援引C++ Primer:为了支持快速的随机访问,
vector
容器的
元素
以连续方式存放,每一个
元素
都紧挨着前一个
元素
存储。设想一下,当
vector
添加一个
元素
时
,为了满足连续存放这个特性,都需要
重新分配
空间、拷贝
元素
、撤销旧空间,这样性能难以接受。因此STL实现者在对
vector
进行
内存
分配
时
,其实际分配的容量
构造函数与
析构函数
的重载及浅拷贝和深拷贝
构造函数可以重载,
析构函数
不可以重载。 因为构造函数可以有多个且可以带参数,
析构函数
只有一个且不能带参数。 转自:http://blog.csdn.net/feitianxuxue/article/details/9275979#comments 对深拷贝与浅拷贝的再次理解 记得11年底找工作的
时
候,面试
时
曾经遇到有面试官问的对
工具平台和程序库
24,855
社区成员
27,329
社区内容
发帖
与我相关
我的任务
工具平台和程序库
C/C++ 工具平台和程序库
复制链接
扫一扫
分享
社区描述
C/C++ 工具平台和程序库
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章