在你的拷贝构造函数中,你只是简单地将 data
成员变量赋值为原始对象 r
的 data
成员变量。这样做会导致两个问题:
浅拷贝:通过简单赋值
data = r.data;
只是将指针地址复制给了新的对象,而不是创建一个新的动态内存副本。当你在析构函数中释放内存时,由于多个对象共享同一块内存,可能会导致重复释放内存或者未定义行为。没有对其他成员变量进行拷贝:除了
data
外,还有left
和right
两个成员变量也需要被拷贝。
为了解决这些问题,你可以在拷贝构造函数中进行深拷贝和正确的初始化操作:
Resource(const Resource& r)
{
data = new int(*r.data); // 深拷贝 data
left = r.left;
right = r.right;
}
通过使用 new int(*r.data)
创建一个新的整型对象,并将其指针赋值给新对象的 data
成员变量。这样就实现了深拷贝。
注意,在修改拷贝构造函数后,请确保提供相应的赋值运算符重载(即重载 operator=
)以及移动构造函数来处理资源所有权转移和释放,以确保正确的对象复制和销毁行为。
内容由零声教学AI助手提供,问题来源于学员提问