【发布时间】:2016-04-18 22:51:18
【问题描述】:
根据我对主题的理解: 浅拷贝是将对象的非指针类型复制到另一个对象。当一个对象有指针时,不能进行浅拷贝,因为被复制的对象将获得该指针的地址,当两个对象中的任何一个被删除时,另一个将悬空,因为它们指向相同的位置在记忆中。 当涉及指针时使用深拷贝,因为它保留了与原始对象空间分开的空间,并且只是将内容从一个内存位置复制到另一个内存位置。这样,当其中一个对象被删除时,另一个对象就不会悬空。 也就是说,我想知道为什么这个程序能正常工作,即使我已经做了一个指针的浅拷贝
struct aStruct {
int *i;
aStruct(int *p) : i(p) {
cout << "Created aStruct" << endl;
}
aStruct(const aStruct &s) {
cout << "Copying aStruct" << endl;
i = s.i;
}
aStruct &operator=(const aStruct &s) {
cout << "Assigning aStruct" << endl;
i = s.i;
return *this;
}
};
int main() {
int *x = new int(3);
aStruct s1(x);
aStruct s2 = s1;
int *y = new int(4);
aStruct s3(y);
s3 = s1;
}
s1、s2 和 s3 都有它们的变量 i 指向同一个地方。因此,当到达 main() 函数的末尾并且其中一个被破坏时,其他的不应该悬空导致错误吗?我的程序运行良好。有人可以向我解释一下吗?
谢谢大家
【问题讨论】:
-
没有任何问题,因为您从不删除任何内容。
-
当结构被销毁时,它不会对它指向的项目做任何事情,因为你没有写析构函数,也没有使用智能指针。
-
您的代码泄漏内存(技术上)。
-
但我认为在代码块的末尾调用默认的析构函数来删除所有指针。不对吗?
-
默认的析构函数是破坏对象本身,其中的“对象”是一个指针。它不对指向的数据做任何事情。此外,虽然您的对象实际上是微不足道的,所以实际上,这里不需要实际的析构函数。
标签: c++ pointers deep-copy shallow-copy