2 young111111234 Young111111234 于 2016.03.25 08:59 提问

C++复制构造函数、内存共享

通过复制构造函数,复制的对象与原对象共享内存么,求各位给个解释

4个回答

qq423399099
qq423399099   Ds   Rxr 2016.03.25 09:52

因为你的Pstu(const Pstu& p)这个拷贝函数里有这么一句pointer = p.pointer;
这就使得无论是p1还是p2他们的private成员变量pointer都指向了和p一样的内存地址
所以不管是哪个对象对自己的pointer所指向的对象的count执行++操作,三个对象都能看到

Young111111234
Young111111234 回复小灸舞: 但是把析构函数重写为delete pointer,函数体内只有这一句,能够编译运行,只不过最后会弹出一个错误,不知道原来的析构函数为什么还要个if判断。
一年多之前 回复
qq423399099
qq423399099 回复Young111111234: 这种三个对象都指着同一个堆空间的,不能重复delete,否则程序要崩
一年多之前 回复
Young111111234
Young111111234 实际上p1,p2也只有一个成员变量pointer,没有其他的数据成员了。那应该怎么释放对象?程序是书上的,pstu的析构函数不是很明白,能给我解释疏通下么
一年多之前 回复
qq423399099
qq423399099 回复Young111111234: p1,p2这些对象本身都是在栈上的,但他们的成员变量中的pointer指向的是堆上new出来的(new student(1000, "张思源")
一年多之前 回复
Young111111234
Young111111234 p1,p2是怎么个解释
一年多之前 回复
Young111111234
Young111111234 回复小灸舞: 拍
一年多之前 回复
Young111111234
Young111111234 嗯嗯,通过 Pstu p = (new student(1000, "张思源"))创建对象p,p为动态对象,那复制得到的p1、p2是不是也是动态对象,是在堆上的?如果是这样的话,我该怎么释放堆对象呢
一年多之前 回复
qq423399099
qq423399099 回复Young111111234: 不是的
一年多之前 回复
Young111111234
Young111111234 嗯嗯,通过 Pstu p = (new student(1000, "张思源"))创建对象p,p为动态对象,那复制得到的p1、p2是不是也是动态对象,是在堆上的?
一年多之前 回复
Young111111234
Young111111234 嗯嗯,通过 Pstu p = (new student(1000, "张思源"))创建对象p,p为动态对象,那复制得到的p1、p2是不是也是
一年多之前 回复
qq423399099
qq423399099   Ds   Rxr 2016.03.25 09:13

很多时候在我们都不知道拷贝构造函数的情况下,传递对象给函数参数或者函数返回对象都能很好的进行,这是因为编译器会给我们自动产生一个拷贝构造函数,这就是“默认拷贝构造函数”,这个构造函数很简单,仅仅使用“老对象”的数据成员的值对“新对象”的数据成员一一进行赋值
一般分成浅拷贝和深拷贝:
浅拷贝,指的是在对象复制时,只对对象中的数据成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。大多情况下“浅拷贝”已经能很好地工作了,但是一旦对象存在了动态成员,这两个指针会指向堆里的同一个空间
在“深拷贝”的情况下,对于对象中动态成员,就不能仅仅简单地赋值了,而应该重新动态分配空间
图片说明

Young111111234
Young111111234 回复小灸舞: 嗯嗯,就是说通过复制构造函数得到的对象与原对象是不共享内存的。请您看我在下面的回答,贴了代码的。谢谢啦
一年多之前 回复
qq423399099
qq423399099 回复Young111111234: 不是共享内存的,比如上图的rect1和rect2对象,只是使得rect2中的成员变量的值和rect1中一样,并不是说他们两个对象中的成员是同一个变量,修改其中一个对象中某变量的值不会影响另一个对象中该变量的值
一年多之前 回复
Young111111234
Young111111234 如果我自定义了复制构造函数,并且对象中并没有动态成员,那么通过复制构造函数复制的对象与原来的对象还是共享内存的么
一年多之前 回复
Young111111234
Young111111234   2016.03.25 09:37

#include "stdafx.h"
#include
#include
using namespace std;

class Pstu;
class student
{
public:
friend class Pstu;
student(int aid, char* pstr) :id(aid), name(pstr)
{
cout << "student构造函数被调用" << endl;
count = 0;
}
~student()
{
cout << "student is destructing..." << endl;
}
void display()
{
cout << "id:" << id << endl;
cout << "name:" << name << endl;

}

private:
unsigned int count;
int id;
char* name;
};
//////////////////////////////////////////////////////////

class Pstu
{
public:
Pstu(student* p) :pointer(p)
{
cout << "Pstu" << endl;
(*pointer).count++;
cout << "此时count为:" << (*pointer).count << endl;
}
Pstu(const Pstu& p)
{
pointer = p.pointer;
cout << "此时count为:" << (*pointer).count << endl;
(*pointer).count++;
cout << "Pstu1" << endl;
cout << "此时count为:" << (*pointer).count << endl;

}
~Pstu()
{
    (*pointer).count--;
    cout << "此时count为:" << (*pointer).count << endl;
    if (!(*pointer).count)
    {
        cout << "Pstu is destructing..." << endl;
        delete pointer;
    }
    //delete pointer;
}
unsigned int get_count()
{
    return (*pointer).count;
}

//student& operator* (){ return *pointer; }
//student* operator->(){ return pointer; }

private:
student* pointer;
};
/////////////////////////////////////////////////////////
int main()
{
Pstu p = (new student(1000, "张思源"));
Pstu p1 = p, p2 = p;
cout << p.get_count() << endl;
cout << p1.get_count() << endl;
cout << p2.get_count() << endl;
//p->display();
return 0;
}

既然是通过复制构造函数得到的p1,p2,为什么三个对象中的count 值都是3?

lwhzccjava
lwhzccjava   2016.03.27 21:27

复制应该是指数据值的拷贝

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!