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