我对这个问题的理解: 浅拷贝是指将对象的非指针类型复制到另一个对象时。当一个对象有指针时,无法完成浅拷贝,因为被复制的对象将获得该指针的地址,当两个对象中的任何一个被删除时,另一个将被悬空,因为它们指向同一个位置在记忆中。 涉及指针时使用深拷贝,因为它保留了与原始对象空间分离的空间,只是将内容从一个内存位置复制到另一个内存位置。这样,当其中一个对象被删除时,其他对象不会悬空。 也就是说,我想知道为什么这个程序正在工作,即使我已经完成了指针的浅表副本
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()函数的末尾并且其中一个被销毁时,其他人是否应该悬空而导致错误?我的程序运行正常。有人可以帮我解释一下吗?
全部谢谢
答案 0 :(得分:4)
您正在复制指针,而不是数据。这里的每个对象本身都是一个对象,另外,你似乎认为C ++是垃圾收集的。它不是(除了一些不常见的实现)
您的程序基本上会泄漏内存,并且只有在操作系统释放终止后消耗的进程时才会清除。因此,在应用程序的整个生命周期中,所有指针都指向完全有效的内存。
答案 1 :(得分:3)
不幸的是,C ++中没有Deep和Shallow指针的概念。 Java和C#中的引用概念与C ++中的指针不同。 你应该阅读
就这样,在C ++中,指针指的是指针所指向的内存位置中的任何对象。
所以,你正在做的是将分配的位置复制到构造函数中的对象...当析构函数运行时,导致整个对象从内存中释放(死机),包括指针int* i
是数据成员。但是,new
分配的内存位置不会被释放,直到有人使用delete
调用同一位置。