vector使用问题?

puny 2008-12-25 12:55:28
如下代码,为什么在vector里会有两次的对象复制呢?
class User
{
public:
User()
{
std::cout<<"人员初始化\r\n";
};
User(const User & user)
{
std::cout<<"人员复制\r\n";
};
~User()
{
std::cout<<"人员销毁\r\n";
};
};


int _tmain(int argc, _TCHAR* argv[])
{

User user;
std::vector<User> users;
users.push_back(user);

return 0;
}
...全文
113 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
SearchLife 2008-12-25
  • 打赏
  • 举报
回复
VC6好像没有这个问题啊
ysuliu 2008-12-25
  • 打赏
  • 举报
回复
你误解了我的意思,第一次拷贝的时候空间是1,所以即使内存检查也是通过的,是放进去第一个对象以后发现满了。。然后自动扩展空间,自动执行了第二次拷贝。。

LZ你去看看你vc安装目录下的include目录,应该会有一个vector的文件,当然真正的实现可能不在这个文件,你看看它包含了哪个,一层一层找,肯定能找到vector的实现,去看看它的构造函数,还有push_back(),肯定就能有原因了。。

我个人觉得如果不影响你使用的话,你可以不管它了,知道是编译器相关的就行了。


[Quote=引用 5 楼 yshuise 的回复:]
引用 3 楼 ysuliu 的回复:
1.std::vector <User> users;
2.users.push_back(user);

我猜你的原因是这样的:
执行第一句的时候,vector的初始分配空间是1
执行第二句的时候,先把user放进去,执行一次拷贝,编译器发现vector空间满了,按照已有策略,应该分配一块更大的空间(一般为原2倍),然后把现在空间内的内容拷贝到新的空间,然后释放原有空间,所以又执行了一次拷贝。。

猜测而已。。

先检验内存够不…
[/Quote]
Aaronico 2008-12-25
  • 打赏
  • 举报
回复
放弃2005,改用03或08吧
puny 2008-12-25
  • 打赏
  • 举报
回复
我用VS2005
yshuise 2008-12-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ysuliu 的回复:]
1.std::vector <User> users;
2.users.push_back(user);

我猜你的原因是这样的:
执行第一句的时候,vector的初始分配空间是1
执行第二句的时候,先把user放进去,执行一次拷贝,编译器发现vector空间满了,按照已有策略,应该分配一块更大的空间(一般为原2倍),然后把现在空间内的内容拷贝到新的空间,然后释放原有空间,所以又执行了一次拷贝。。

猜测而已。。
[/Quote]
先检验内存够不够,后拷贝,所以猜测不对。呵呵。
yshuise 2008-12-25
  • 打赏
  • 举报
回复
我用 devcpp编译器显示正常。
ysuliu 2008-12-25
  • 打赏
  • 举报
回复
1.std::vector <User> users;
2.users.push_back(user);

我猜你的原因是这样的:
执行第一句的时候,vector的初始分配空间是1
执行第二句的时候,先把user放进去,执行一次拷贝,编译器发现vector空间满了,按照已有策略,应该分配一块更大的空间(一般为原2倍),然后把现在空间内的内容拷贝到新的空间,然后释放原有空间,所以又执行了一次拷贝。。

猜测而已。。
ysuliu 2008-12-25
  • 打赏
  • 举报
回复
你的编译器的问题。

我测试了一下,只有一次拷贝,我用的Dev C++,gcc编译器。。
你去看一下你的编译器include/vector的实现吧,肯定能找到原因。


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

class User
{
public:
User()
{ std::cout<<"人员初始化\r\n"; }

User(const User & user)
{ std::cout<<"人员复制\r\n"; }

~User()
{ std::cout<<"人员销毁\r\n"; }
};

void test()
{
User user;
std::vector <User> users;
users.push_back(user);
}

int main()
{
test();
system("pause");
return 0;
}


输出:

人员初始化
人员复制
人员销毁
人员销毁
ress any key to continue . . .
puny 2008-12-25
  • 打赏
  • 举报
回复
为什么在push-back会有两次对象copy呢?
执行显示如下:
人员初始化
人员复制
人员复制
人员销毁
人员销毁
人员销毁

65,211

社区成员

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

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