vector.push_back(obj) 调用了析构函数

yxandyx 2007-11-02 03:55:43

vector<AnyContainer> mArgs; // vector实例

void AddArg(AnyContainer& ac,bool isClear=false)
{
if(isClear)
mArgs.clear();
mArgs.push_back(ac); //调用了ac的析构函数.
}

这是怎么回事呢.
...全文
743 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
pass86 2007-11-05
  • 打赏
  • 举报
回复
vector存的是,T类型的副本,
至于析构,并不是在那个位置,而是作用域退出了。
UPJF
bigpin 2007-11-05
  • 打赏
  • 举报
回复
push_back要存的是对象的一个拷贝,并不是对象本身。
yxandyx 2007-11-05
  • 打赏
  • 举报
回复
查出来了,vector在push_back的时候,确实进行两次的copy,
第一步:
将push_back(ac)的时候,vector内建了一个temp,将ac copy给temp.

第二步:
调整vector大小,如果分配的长度不够,则重新分配内存(包括把原来所有元素从新分配,比如当前vector已经有一个元素,那么这次申请两个元素的空间,首先将原有的元素进行copy 到新空间的第一个位置,然后再将第一步的temp copy到第二个位置).

第三步:
调用在第一步,第二步中用到的所有临时变量的析构.

第一步和第二步讲到的copy,都是新建一个元素,然后调用构造元素进行.

基于vector的效率,我放弃使用了.呵呵
kelvenyiu 2007-11-05
  • 打赏
  • 举报
回复
学到东西了
cust_hf 2007-11-03
  • 打赏
  • 举报
回复
如下修改
vector <AnyContainer> mArgs; // vector实例
修改为
vector <AnyContainer&> mArgs; // vector实例
39457760 2007-11-02
  • 打赏
  • 举报
回复
楼主应该查一下到底是“哪一个对象”的析构函数被调用
仅仅看到析构函数调用是不足以判断是ac对象调用析构函数
后面的举的例子也是这个问题
飞哥 2007-11-02
  • 打赏
  • 举报
回复
AnyContainer temp=ac; //这次跟没写一样
mArgs.push_back(temp);//这回调用的是temp的析构函数,而且调用了两次 ///关键都在这个里面

Jofee 2007-11-02
  • 打赏
  • 举报
回复
->mArgs.push_back(temp);//这回调用的是temp的析构函数,而且调用了两次
temp是栈里的局部变量,
第二次是函数AddArg结束之前摧毁栈的时候调用的,
应该不是mArgs.push_back(temp)中调用的,

yxandyx 2007-11-02
  • 打赏
  • 举报
回复
改成如下:
if(isClear)
mArgs.clear();
AnyContainer temp=ac;
mArgs.push_back(temp);//这回调用的是temp的析构函数,而且调用了两次

这怎么解释呢
xiantongyuan 2007-11-02
  • 打赏
  • 举报
回复
都说了, 这要看stl的内部实现了,这只能说明,vector里存的是你传入的参数的一个副本
yxandyx 2007-11-02
  • 打赏
  • 举报
回复
函数参数声明为引用 AnyContainer&

void AddArg(AnyContainer& ac,bool isClear=false)

所以,函数在执行完毕之后,也不会调用ac的析构

可是 mArgs.push_back(ac); 居然调用了,搞不明白哦
yxandyx 2007-11-02
  • 打赏
  • 举报
回复
新发现:

int k=13;
AnyContainer ac=&k;

AddArg(ac); //AddArgx函数在内部调用了ac的析构函数;

//到这里ac已经被析构了.

函数为什么调用ac的析构呢
void AddArg(AnyContainer& ac,bool isClear=false)
{
if(isClear)
mArgs.clear();
mArgs.push_back(ac); //调用了ac的析构函数.
}
  • 打赏
  • 举报
回复
不用看那个实现,看的是STL的实现 .
Jofee 2007-11-02
  • 打赏
  • 举报
回复
这个可能就要看你用的stl的具体实现了。
yxandyx 2007-11-02
  • 打赏
  • 举报
回复
akirya
坏[其实偶不是什么所谓的坏人]

AnyContainer 类的实现在这个贴子中:
http://topic.csdn.net/u/20071101/10/0d44a40c-0c6a-4596-a1c8-3d4d6c881bd5.html?seed=705421118
weiym 2007-11-02
  • 打赏
  • 举报
回复
容器里存放的是对象的副本
  • 打赏
  • 举报
回复
VC8 的结果如下
test::test
--
test::test(const test&s)
test::test(const test&s)
test::~test
--
test::~test
test::~test
  • 打赏
  • 举报
回复
这是G++ 4.2的结果
  • 打赏
  • 举报
回复
这个得看库的具体实现了


#include <iostream>
#include<vector>
using namespace std;

class test
{
public:
test()
{
cout<<"test::test"<<endl;
}
~test()
{
cout<<"test::~test"<<endl;
}
test(const test&s)
{
cout<<"test::test(const test&s)"<<endl;
}
};

int main(int argc, char *argv[])
{
test xxx;
std::vector<test> buf;
cout<<"--"<<endl;
buf.push_back( xxx );
cout<<"--"<<endl;
return 0;
}

输出如下
test::test
--
test::test(const test&s)
--
test::~test
test::~test

65,170

社区成员

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

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