Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-复制指针。为什么这个代码能工作?_C++_Pointers_Deep Copy_Shallow Copy - Fatal编程技术网

C++ C++;-复制指针。为什么这个代码能工作?

C++ C++;-复制指针。为什么这个代码能工作?,c++,pointers,deep-copy,shallow-copy,C++,Pointers,Deep Copy,Shallow Copy,就我对该主题的理解而言: 浅复制是指将对象的非指针类型复制到另一个对象。当一个对象有指针时,不能进行浅层复制,因为被复制的对象将获得该指针的地址,而当两个对象中的任何一个被删除时,另一个将悬空,因为它们指向内存中的同一位置。 当涉及指针时使用深度复制,因为它保留了一个与原始对象空间分开的空间,并且只将内容从一个内存位置复制到另一个内存位置。这样,当其中一个对象被删除时,另一个对象不会悬空。 也就是说,我想知道为什么这个程序可以工作,即使我做了一个指针的浅拷贝 struct aStruct {

就我对该主题的理解而言: 浅复制是指将对象的非指针类型复制到另一个对象。当一个对象有指针时,不能进行浅层复制,因为被复制的对象将获得该指针的地址,而当两个对象中的任何一个被删除时,另一个将悬空,因为它们指向内存中的同一位置。 当涉及指针时使用深度复制,因为它保留了一个与原始对象空间分开的空间,并且只将内容从一个内存位置复制到另一个内存位置。这样,当其中一个对象被删除时,另一个对象不会悬空。 也就是说,我想知道为什么这个程序可以工作,即使我做了一个指针的浅拷贝

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;
}
struct结构{
int*i;
aStruct(int*p):i(p){

CUT< P>你正在复制指针,而不是数据。每个对象都是自己的一个对象,另外,你似乎觉得C++是垃圾收集的。它不是(除了一些不常见的实现)


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

您复制的是指针,而不是数据。这里的每个对象都是自己的对象对,另外,您似乎觉得C++是垃圾收集的,它不是(除了一些不常见的实现)


<>你的程序基本上泄漏内存,只因OS释放了进程结束后所消耗的任何内容而被清除。因此,所有指针都指向应用程序生命周期中的完全有效内存。

< P>不幸的是,C++中没有深层和浅指针的概念。爪哇和C语言中的引用不同于C++中的指针。 你应该继续读下去

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


因此,您正在做的是将分配的位置复制到构造函数中,并将其复制到对象中…当析构函数运行时,当然会从内存中释放整个对象(死)C++中的指针<代码> int *i/代码>是一个数据成员。但是,在<代码> >删除> />代码>之前,没有分配给代码<新> /代码>所存储的内存位置。遗憾的是,在C++中没有深度和浅指针的概念。爪哇和C语言中的引用概念与C中的指针不同。++. 你应该继续读下去

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


因此,您正在做的是将分配的位置复制到构造函数中,并将其复制到对象中…当析构函数运行时,当然会从内存中释放整个对象(死),包括作为数据成员的指针
int*i
。但是由
new
分配的内存位置不会被释放,直到有人用
delete

调用同一位置时才会释放,因为您从未删除任何内容。当结构被破坏时,它不会对它所指向的项目做任何事情,因为您没有这样做“没有编写析构函数,也没有使用智能指针。您的代码(技术上)会泄漏内存。但我认为在代码块末尾会调用默认析构函数来删除所有指针。对不对?默认析构函数正在使用“object”来销毁对象本身”问题是作为指针。它与所指向的数据没有任何关系。此外,您的对象实际上很小,因此实际上,这里不需要实际的析构函数。由于您从未删除任何内容,因此不会出现任何悬空。当结构被破坏时,它不会对它所指向的项目做任何事情,因为您没有写入使用析构函数,但没有使用智能指针。您的代码(从技术上讲)会泄漏内存。但我认为在代码块末尾会调用默认析构函数来删除所有指针。这样不对吗?默认析构函数使用“object”来销毁对象本身另外,你的对象实际上是微不足道的,所以实际上,这里不需要实际的析构函数。如果OP假定C++是垃圾收集的,那么假定有悬空指针是没有意义的。我认为OP假设当POI时NTE被破坏,它的尖对象也被破坏了。当然,如果OP假设C++是垃圾收集的,那么假设有悬空指针是没有意义的。我认为OP假设当指针被销毁时,它的尖对象也被破坏。当然,情况不是这样。如果你忽略了这个答案的其余部分,那么你就愚蠢地这样做了,请阅读关于三法则的链接。如果你忽略了这个答案的其余部分,那么你愚蠢地这样做了,请阅读关于三法则的链接。