根据定义:当复制该类的对象时,指针成员被复制,而不是指向缓冲区,从而导致两个对象指向相同的,因此我们使用复制构造函数。
但是在下面的类中,没有复制构造函数,但它可以工作!为什么?为什么我不需要深抄?
class Human
{
private:
int* aValue;
public:
Human(int* param)
{
aValue=param;
}
void ShowInfos()
{
cout<<"Human's info:"<<*aValue<<endl;
}
};
void JustAFunction(Human m)
{
m.ShowInfos();
}
int main()
{
int age = 10;
Human aHuman(&age);
aHuman.ShowInfos();
JustAFunction(aHuman);
return 0;
}产出:
人类信息: 10 人类信息: 10
发布于 2013-11-19 12:43:23
正如前面提到的,它对您有效的原因是,实际上让多个指针指向同一个对象是很好的--这就是要点之一,共享数据而不复制它。
如果指向的对象的生存期由包装类管理,即:它是在类实现的方法(通常是类的构造函数和析构函数)中创建和销毁的,那么问题就出现了。在这种情况下,复制构造函数中需要一个深拷贝。
在您(诚然是人为的)示例中,int具有更长的生存期,而携带指针的对象应该使用引用作为成员进行检查,并在初始化列表中初始化。这消除了忘记自己和从类中删除对象的可能性。
class Human
{
private:
int& aRef;
public:
Human(int& param)
: aRef(param)
{
}
};还应考虑指针或引用是否应该指向const对象:
class Human
{
private:
const int& aRef;
public:
Human(const int& param)
: aRef(param)
{
}
};发布于 2013-11-19 12:30:40
当您的类拥有资源时,复制构造函数非常有用。在您的例子中,它没有-它既不创建也不删除aValue本身。
如果你确实这么做了,就说:
Human()
{
aValue=new int;
}适当地清理了记忆:
~Human()
{
delete aValue;
}然后就会遇到问题,因为Human a;和Human b(a);会让成员aValue指向同一个位置,当它们超出作用域时,会释放相同的内存,从而导致双重删除。
发布于 2013-11-19 12:31:11
这是因为类中的指针指向堆栈变量age。
您还没有为类Human编写析构函数,所以在Human被复制到JustAFunction中时,不要尝试执行双重删除
如果您以不同的方式使用它,例如将一个newed int发送到类中,则会出现内存泄漏。
Human human(new int);如果复制,就会有两个指向同一内存的指针,这本身并不是问题,但很难确定是谁负责释放该内存。
https://stackoverflow.com/questions/20071572
复制相似问题