C ++ - 浅复制指针。为什么这段代码有效?

时间:2016-04-18 22:51:18

标签: c++ pointers deep-copy shallow-copy

我对这个问题的理解: 浅拷贝是指将对象的非指针类型复制到另一个对象时。当一个对象有指针时,无法完成浅拷贝,因为被复制的对象将获得该指针的地址,当两个对象中的任何一个被删除时,另一个将被悬空,因为它们指向同一个位置在记忆中。 涉及指针时使用深拷贝,因为它保留了与原始对象空间分离的空间,只是将内容从一个内存位置复制到另一个内存位置。这样,当其中一个对象被删除时,其他对象不会悬空。 也就是说,我想知道为什么这个程序正在工作,即使我已经完成了指针的浅表副本

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()函数的末尾并且其中一个被销毁时,其他人是否应该悬空而导致错误?我的程序运行正常。有人可以帮我解释一下吗?

全部谢谢

2 个答案:

答案 0 :(得分:4)

您正在复制指针,而不是数据。这里的每个对象本身都是一个对象,另外,你似乎认为C ++是垃圾收集的。它不是(除了一些不常见的实现)

您的程序基本上会泄漏内存,并且只有在操作系统释放终止后消耗的进程时才会清除。因此,在应用程序的整个生命周期中,所有指针都指向完全有效的内存。

答案 1 :(得分:3)

不幸的是,C ++中没有Deep和Shallow指针的概念。 Java和C#中的引用概念与C ++中的指针不同。 你应该阅读

就这样,在C ++中,指针指的是指针所指向的内存位置中的任何对象。

所以,你正在做的是将分配的位置复制到构造函数中的对象...当析构函数运行时,导致整个对象从内存中释放(死机),包括指针int* i是数据成员。但是,new分配的内存位置不会被释放,直到有人使用delete调用同一位置。