C++/STL_中的push_back方法与复制数据的问题


STL中有push_back 等方法 可以将一个数据放入容器中


在push_back中完成的是值拷贝,而不仅仅是地址的复制。


#include <vector>
#include <iostream>

using namespace std;

typedef struct point{
	int x;
	int y;
}Point;



ostream& operator<<(ostream& output, const Point &a)
{
	return output << a.x <<" "<< a.y;
}

int main(){

	Point * a = new Point;
	vector<Point> PointList;


	a->x = 3;
	a->y = 4;
	PointList.push_back(*a);

	a->x = 4;
	a->y = 4;
	PointList.push_back(*a);
	
	a->x = 5;
	a->y = 4;
	PointList.push_back(*a);

	delete a;

	for (vector<Point>::iterator i = PointList.begin(); i != PointList.end(); i++){
		cout << (*i)<< endl;
	}

	return 0;
}



这说明完成的不是将a的地址加入到vector,而是将数据整个拷贝了一份加入进去。

当然如果用类(如Point类)构造的容器来说如果有new/malloc分配的空间,要重写复制构造函数才不会出问题。

#3 0x000000000046ef07 in ~_Vector_base (this=0x6a4ead0, __in_chrg=<value optimized out>) at /usr/include/c++/4.4/bits/stl_vector.h:132 #4 0x000000000046dd2d in ~vector (this=0x6a4ead0, __in_chrg=<value optimized out>) at /usr/include/c++/4.4/bits/stl_vector.h:313 #5 0x000000000046b7c8 in ~ZXJC_LineCover (this=0x6a4ea30, __in_chrg=<value optimized out>) at ../../web/demonitordll/dbproc.h:236 #6 0x000000000046b7e2 in std::_Destroy<ZXJC_LineCover> (__pointer=0x6a4ea30) at /usr/include/c++/4.4/bits/stl_construct.h:83 #7 0x000000000046795a in std::_Destroy_aux<false>::__destroy<ZXJC_LineCover*> (__first=0x6a4ea30, __last=0x6a4ea18) at /usr/include/c++/4.4/bits/stl_construct.h:93 #8 0x000000000045bc7f in std::_Destroy<ZXJC_LineCover*> (__first=0x6a4e960, __last=0x6a4ea18) at /usr/include/c++/4.4/bits/stl_construct.h:116 #9 0x000000000044920f in std::_Destroy<ZXJC_LineCover*, ZXJC_LineCover> (__first=0x6a4e960, __last=0x6a4ea18) at /usr/include/c++/4.4/bits/stl_construct.h:142 #10 0x00007f3769464bde in std::vector<ZXJC_LineCover, std::allocator<ZXJC_LineCover> >::_M_insert_aux (this=0x7f374ee9aca0, __position=..., __x=...) at /usr/include/c++/4.4/bits/vector.tcc:359 #11 0x00007f376945c985 in std::vector<ZXJC_LineCover, std::allocator<ZXJC_LineCover> >::push_back (this=0x7f374ee9aca0, __x=...) at /usr/include/c++/4.4/bits/stl_vector.h:741 #12 0x00007f3769445ca0 in CDBProc::GetLineCoverageRate (this=0x7f3758003690, o_fStatistRate=@0x7f374ee9acdc, o_strErr=..., feederVec=...) at dbproc.cpp:3472
06-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值