为什么会出现这么诡异的现象,谁能解释一下?

ithiker 2014-02-27 01:02:59
下面是测试代码:

#include<vector>
using namespace std;
int main(int argc, _TCHAR* argv[])
{
class D
{
public:
D(int i=0){num=i;}
~D(){cout << "destruct D. my num=" << num<< endl;}
void print() { cout << "I'm a D. my num=" << num<< endl; }
int num;
};
vector<D> V;
V.push_back(D(11));
V.push_back(D(22));
V.push_back(D(33));
//V.push_back(D(44));
//V.push_back(D(55));
for_each(V.begin(), V.end(), mem_fun_ref(&D::print));

return 0;
}

输出:
11总共析构4次,22 3次 33 2次



添加44到V中:
11总共析构5次,22 4次 33 3次 44 2次



...全文
150 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
翅膀又硬了 2014-02-27
  • 打赏
  • 举报
回复
V.reserve(10);
ithiker 2014-02-27
  • 打赏
  • 举报
回复
引用 3 楼 menzi11 的回复:
vector内部维护着一个数组,每次resize的时候如果这个数组没有余量了 vector就会重新分配内存并且把原来的数据拷贝到新数据上再把原来的删掉, 看D(11),第一次销毁是作为参数传入vector的时候销毁了一次,然后vector以为你 就push一次,因此只分配了sizeof(D)这么长的数组,结果你又push了一次,vector要重新 分配数组,所以又要销毁位于原来的数组上的D(11)一次,结果你又push了一次,vector要重新 分配数组,所以又要销毁位于原来的数组上的D(11)一次,结果你又push了一次,vector要重新 分配数组,所以又要销毁位于原来的数组上的D(11)一次......一共4次. 其他的同理. 话说楼主这什么编译器和库啊? 怎么连NRVO和提前emplace一下都不会啊
分析的很有道理,加一个reserve就OK了 用的vs2008, NRVO和提前emplace这个还真没用过,还请赐教
ithiker 2014-02-27
  • 打赏
  • 举报
回复
引用 2 楼 u011873969 的回复:
首先第一次见到在main函数里定义class的;其次楼主应该要知道class里的“三巨头”吧,出现~,就要出现copy constructor以及assignment operator.
OK,其实放哪里无所谓,放外面更规范。
ithiker 2014-02-27
  • 打赏
  • 举报
回复
引用 1 楼 ri_aje 的回复:
不知道楼主听说过复制构造函数吗。 有的话,加上。再数数构造析构的次数就会相同了。 vector 每次内存不够需要增长的时候都会 move construct 已经存在的元素到新地址。
大牛别取笑我了,随便写的测试mem_fun_ref的代码,没关注D的细节,专门在查mem_fun_ref,结果这块出问题了~~~
menzi11 2014-02-27
  • 打赏
  • 举报
回复
vector内部维护着一个数组,每次resize的时候如果这个数组没有余量了 vector就会重新分配内存并且把原来的数据拷贝到新数据上再把原来的删掉, 看D(11),第一次销毁是作为参数传入vector的时候销毁了一次,然后vector以为你 就push一次,因此只分配了sizeof(D)这么长的数组,结果你又push了一次,vector要重新 分配数组,所以又要销毁位于原来的数组上的D(11)一次,结果你又push了一次,vector要重新 分配数组,所以又要销毁位于原来的数组上的D(11)一次,结果你又push了一次,vector要重新 分配数组,所以又要销毁位于原来的数组上的D(11)一次......一共4次. 其他的同理. 话说楼主这什么编译器和库啊? 怎么连NRVO和提前emplace一下都不会啊
哈利_蜘蛛侠 2014-02-27
  • 打赏
  • 举报
回复
首先第一次见到在main函数里定义class的;其次楼主应该要知道class里的“三巨头”吧,出现~,就要出现copy constructor以及assignment operator.
ri_aje 2014-02-27
  • 打赏
  • 举报
回复
不知道楼主听说过复制构造函数吗。 有的话,加上。再数数构造析构的次数就会相同了。 vector 每次内存不够需要增长的时候都会 move construct 已经存在的元素到新地址。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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