浅拷贝和深拷贝,以及push_back()的奥秘【转】

转载 2015年07月10日 17:12:57

浅拷贝和深拷贝,以及push_back()的奥秘【转】

using namespace std;
class CDemo{
public:
                 CDemo():str(NULL){};
                 ~CDemo()
{
if(str)
delete [] str;
};
                 char *str;
};
int main(int argc, char ** argv)
{
                 CDemo d1;
                 d1.str = new char[32];
                 strcpy(d1.str, "trend micro");
                 vector<CDemo> *a1 = new vector<CDemo>();
                 a1->push_back(d1);
                 delete a1;
                 return 0;
}

编译能通过

解答:默认的拷贝构造只是成员拷贝,于是两个对象str的值相同,两次析构delete了相同的str,解决办法是弄一个拷贝构造函数,里边strdup一下str。其实这也就是浅拷贝和深拷贝的区别。
须改成:

using namespace std;
class CDemo{
public:
                 CDemo():str(NULL){};
CDemo(const CDemo &temp)
{ 
str = new char[strlen(temp.str) + 1];
strcpy(str, temp.str);
}

                 ~CDemo()
{
if(str)
delete [] str;
};
                 char *str;
};
int main(int argc, char ** argv)
{
                 CDemo d1;
                 d1.str = new char[32];
                 strcpy(d1.str, "trend micro");
                 vector<CDemo> *a1 = new vector<CDemo>();
                 a1->push_back(d1);
                 delete a1;
                 return 0;
}

其实还有人觉得疑惑,为什么push_back的函数原型为:
void push_back(const _Ty& _Val)
参数是引用传递的,那为什么还会调用拷贝构造函数呢,这个秘密在于push_back内部还调用了另一个函数insert(),而insert()函数则调用了拷贝构造函数:

void push_back(const _Ty& _Val)
{       // insert element at end
                   if (size() < capacity())

#if _HAS_ITERATOR_DEBUGGING
                            { // room at end, construct it there
                            _Orphan_range(_Mylast, _Mylast);
                            _Mylast = _Ufill(_Mylast, 1, _Val);
                            }

#else
                            _Mylast = _Ufill(_Mylast, 1, _Val);
#endif

                   else
                            insert(end(), _Val);
}

stl中push_back和浅拷贝和深拷贝的问题

《程序员面试宝典》中stl模板与容器中的一个例子: #include #include #include #include #include using namespace std; c...
  • u012501459
  • u012501459
  • 2015年03月08日 23:03
  • 7652

浅拷贝和深拷贝,以及push_back()的奥秘【转】

#include   using namespace std; class CDemo{ public:                  CDemo():str(NULL){};   ...
  • u013023650
  • u013023650
  • 2015年07月10日 17:07
  • 151

c++深拷贝和浅拷贝

C++中类的拷贝有两种:深拷贝,浅拷贝当出现类的等号赋值时,会调用拷贝函数 在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。当数据成员中没有指针时,浅...
  • u010700335
  • u010700335
  • 2014年10月06日 19:27
  • 1775

深拷贝和浅拷贝的理解与应用

深拷贝和浅拷贝的理解与应用 对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用对象的部分或全部...
  • u014628388
  • u014628388
  • 2017年08月22日 23:55
  • 360

关于Python中深拷贝与浅拷贝的理解(一)---概念

缘由 用Python也有很长时间了,一直在做科学计算和爬虫采集方面的东西。自己的毕业论文涉及到编写一个科学计算的软件,也是用Python编写。界面采用PyQt。 软件的主体前段时间已经写好,最近在试算...
  • u014433413
  • u014433413
  • 2015年11月10日 20:15
  • 3068

python整理二十五——谈谈浅拷贝与深拷贝

python中的浅拷贝深拷贝的概念和C++里面的浅拷贝深拷贝是一样的。所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝,边看例子边解释: #1>>> ls1 = [1,2,3,4,5]>>...
  • hong201
  • hong201
  • 2009年04月26日 23:31
  • 11188

C++ 深拷贝 与 浅拷贝

本文分三部分阐释深拷贝于浅拷贝,着眼点主要还是在深拷贝。第一部分讲述为什么会有拷贝,即对象之间的复制。第二部分讲述为什么会有深拷贝于浅拷贝,即类成员存在资源分配。第三部分阐释深拷贝于浅拷贝的定义与使用...
  • u013630349
  • u013630349
  • 2015年06月01日 22:33
  • 965

java的深拷贝与浅拷贝

转载:http://www.2cto.com/kf/201401/273852.html Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以...
  • lcg910978041
  • lcg910978041
  • 2016年07月22日 10:46
  • 7046

iOS开发——深拷贝与浅拷贝详解

深拷贝和浅拷贝这个问题在面试中常常被问到,而在实际开发中,只要稍有不慎,就会在这里出现问题。尤其对于初学者来说,我们有必要来好好研究下这个概念。我会以实际代码来演示,相关示例代码上传至 这里 。   ...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016年06月28日 01:41
  • 8414

Python 赋值、浅拷贝、深拷贝的区别?

http://songlee24.github.io/2014/08/15/python-FAQ-02/ 在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念...
  • yugongpeng_blog
  • yugongpeng_blog
  • 2015年06月23日 12:20
  • 3573
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅拷贝和深拷贝,以及push_back()的奥秘【转】
举报原因:
原因补充:

(最多只允许输入30个字)