注册 登录
编程论坛 C++教室

请教各位一个关于深浅拷贝的问题

lionmusicyj 发布于 2008-11-04 00:17, 1006 次点击
#include <iostream>
using namespace std;
class String
{
   private:
      char *a;
      int len;
   public:
      void showstr()
      {
       cout<<"string:"<<a<<",length:"<<len<<endl;
      }
      String()
      {
         len=0;
         a=NULL;
      }
      String(const char *p)
      {
         len=strlen(p);
         a=new char[len+1];
         strcpy(a,p);
      }
      ~String()
      {
         if(a!=NULL)
         {
            delete a;
            a=NULL;
         }
      }
};



int main()
{
   String s1("123456");    //上面有个定义的拷贝构造函数,但是我的书上说按照下面这样拷贝会有问题,因为不是 深拷贝,只是一般的浅拷贝,但是我用DEV运行并没有报错,请问各位这是为什么呀?
   String s2(s1);
   s2.showstr();
   system("pause");
   
}
望各位回帖哈 ~!小弟对这种深浅拷贝弄的不是很明白~!谢谢了 ~!
7 回复
#2
debroa7232008-11-04 02:47
上面代码的确是没有错,但如果在实际应用中,它是存在问题的.
String s2(s1);这个拷贝并没有复制字符串,只是将指针的值复制过来了,而不是自己new出来的,这就意味着如果s1被修改或是s1被析构,那么s2中的字符串也会变化.这样就不能达到复制的目的.
建议增加构造器
String(const String & str)
      {
         len=str.len;
         a=new char[str.len+1];
         strcpy(a,str.a);
      }
#3
sunkaidong2008-11-04 09:48
http://topic.
LZ你的不是浅拷贝,是深拷贝..浅拷贝是指针赋值,指向同一个内存;深的是把数值复制,开辟一个新的内存区,与原来的不产生干扰.浅拷贝是有问题的,会两次释放同一个内存区...
#4
newyj2008-11-04 10:45
浅拷贝是两个指针 指向同一个地址
如果一个指针被delete的话 那另一个指针 就会 成 "野指针"的
如果再 delete 这个 指针的话 那就会有意想不到的事情发生
#5
lionmusicyj2008-11-04 12:40
呵呵`
差不多搞明白了
是看类在定义的时候有没有牵涉到一些关于地址操作的时候,才有讨论深浅拷贝的意义吧?
#6
shmilytong2008-11-04 23:45
我认为版主忽略了一点,就是在使用strcpy函数时应该加上头文件#include <string>吧
#7
tls4113232008-11-05 09:37
const 的用法各位高手指点一下
#8
zzt_4282008-12-03 15:03
浅拷贝和深拷贝说的是对象之间的拷贝。比如说,对象A和对象B都含有一个指针,现在想把对象B拷贝到对象A,仅仅把指针拷贝过来,叫做浅拷贝,把指针以及指针指向的内容都拷贝过来,叫做深度拷贝。
1