由push_back引起的复制构造函数
来源:互联网 发布:java应用服务器开发 编辑:程序博客网 时间:2024/04/30 12:12
以下这段程序有错误,是关于没有复制构造函数的错误,下面我们将解开这段程序错误之谜:
#include <string.h>#include <vector>#include <iostream>using namespace std;int i=0;int j=0;class CDemo{ public: CDemo():str(NULL){cout<<"constructor_"<<i++<<endl;}; //注释掉下面这段复制构造函数 //CDemo(const CDemo &cd){cout<<"constructor_"<<i++<<endl;this->str=new char[strlen(cd.str)+1];strcpy(str,cd.str);}; ~CDemo(){cout<<"destrcutor_"<<j++<<endl;if(str) delete []str;}; char *str;};int main(){ CDemo d1; d1.str=new char[32]; strcpy(d1.str,"hello_a_world"); vector<CDemo> *a1=new vector<CDemo>(); a1->push_back(d1);//×××××××××关键语句 delete a1;}源代码中已经标出了关键语句,这段语句中主要函数是属于vector的push_back,下面看看push_back源码:
void push_back(const T &x){ if(finish!=end_of_storage) { construct(finish,x); ++finish; } else//如果备用空间不足 { insert_aux(end(),x); }}constuct函数的原型如下:
template<class T1,class T2>inline void construct(T1 *p,const T2&value){ new (p)T1(value);}好了,上一篇文章(定位new表达式)已经列出来了,这里是一个定位new表达式,那么算法深入到这一步,我们到底是需要什么呢?首先new(p)T1(value)中,p是个指针,或者说是个迭代器,这个指针所指的类型是T1,那么在本例中T1是什么呢?是CDemo;T2的类型是什么呢?也是CDemo,好了,new是要初始化这片内存的,应该选用哪个构造函数呢,很显然是一个像下面这样的复制构造函数了:
CDemo(const CDemo &cd){};但是,源程序里面是没有这段函数的,所以会报错。因此只要在源代码把注释符去掉一切就都OK了。
- 由push_back引起的复制构造函数
- 续:vector的push_back和复制构造函数问题
- c++的赋值构造函数以及vector::push_back的问题
- 一段代码引起的对C++构造函数、析构函数,复制构造函数,运算符重载的深度理解
- 一个由模板函数引起的问题
- 一个由sscanf函数引起的bug
- vector push_back 是否调用构造函数
- vector:push_back时的对象构造
- 复制构造函数的疑惑
- 复制构造函数的调用
- 复制构造函数的总结
- C++ 的复制构造函数
- 复制构造函数的理解
- 复制构造函数的使用
- C++的复制构造函数
- 复制构造函数的理解
- 复制构造函数的构造操作
- 2.2 复制构造函数的构造操作
- OpenCV学习笔记(六)—序列
- [2009国家集训队]小Z的袜子(hose)
- js字符串转日期格式
- linux防火墙禁IP命令
- 网站商务通使用总结:
- 由push_back引起的复制构造函数
- Linux双网卡绑定(Redhat)
- 火狐浏览器所有的快捷键
- flex image加载图片
- 什么是WINSXS文件夹 关于VS2005程序发布的问题
- PHOTOSHOP中处理后缀为“.rgb”的文件
- VC ado调用oracle执行存储过程获取记录集
- 跪求Visio Premium 2010的产品密钥,在线等,谢谢!
- C# C/S程序获取MAC地址三种方法