浅拷贝指针。 为什么这个代码有效?

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

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 ++中的指针变量和引用变量之间有什么区别?
  • 什么是智能指针,我应该什么时候使用它?
  • 什么是三项规则?
  • 以这种方式来说,在C ++中,指针指向指针所指向的内存位置中的任何对象。

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

    链接地址: http://www.djcxy.com/p/79375.html

    上一篇: Shallow copying a pointer. Why is this code working?

    下一篇: C++ compiler 'shallow' copies and assignments