Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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++_Copy Constructor - Fatal编程技术网

C++ 内存分配和拷贝构造函数

C++ 内存分配和拷贝构造函数,c++,copy-constructor,C++,Copy Constructor,在这种情况下,以成员方式复制存储的成员不会复制缓冲区(只复制指针) 但是这里的内存是由new分配的。那么,为什么仍然说只有指针将被复制,而不是整个缓冲区?在您的类中,存储了一个名为的指针。复制类的实例时,例如 Class a("hello"); Class b = a; // Copying a 然后将复制存储的指针,,这样就有两个对象具有相同的指针。然后,如果删除一个对象中的指针,那么另一个对象的指针仍将指向未分配的内存 这就是为什么您需要创建一个: 现在,如果您有上面的复制构造函数,当复

在这种情况下,以成员方式复制存储的成员不会复制缓冲区(只复制指针)


但是这里的内存是由
new
分配的。那么,为什么仍然说只有指针将被复制,而不是整个缓冲区?

在您的类
中,存储了一个名为
的指针。复制
的实例时,例如

Class a("hello");
Class b = a;  // Copying a
然后将复制存储的指针
,这样就有两个对象具有相同的指针。然后,如果
删除一个对象中的指针,那么另一个对象的指针仍将指向未分配的内存

这就是为什么您需要创建一个:

现在,如果您有上面的复制构造函数,当复制发生时,就像在我的第一个代码段中一样,那么将分配一个新字符串,并复制来自另一个实例的内容。当然,在两个对象实例之间指定时,还需要使用:

Class& operator=(const Class& other);

在类中
类中
存储了一个名为
的指针
。复制
的实例时,例如

Class a("hello");
Class b = a;  // Copying a
然后将复制存储的指针
,这样就有两个对象具有相同的指针。然后,如果
删除一个对象中的指针,那么另一个对象的指针仍将指向未分配的内存

这就是为什么您需要创建一个:

现在,如果您有上面的复制构造函数,当复制发生时,就像在我的第一个代码段中一样,那么将分配一个新字符串,并复制来自另一个实例的内容。当然,在两个对象实例之间指定时,还需要使用:

Class& operator=(const Class& other);

因为您存储的
变量是一个普通指针(实际上是缓冲区的地址)。因此,当你复制一个对象时,这个指针(地址)被复制到另一个对象。因此,最终两个对象指向同一位置(缓冲区)。要获得正确的行为,您需要使用一些智能缓冲区(如std::vector),或者在其中手动写入复制ctor和复制缓冲区。

new
不会以任何方式处理它。

因为存储的
变量是一个普通指针(有效的缓冲区地址)。因此,当你复制一个对象时,这个指针(地址)被复制到另一个对象。因此,最终两个对象指向同一位置(缓冲区)。要获得正确的行为,您需要使用一些智能缓冲区(如std::vector),或者在其中手动写入复制ctor和复制缓冲区。

new
不会以任何方式处理它。

您的类有一个成员,他是名为
存储的指针。复制
的实例时:

Class foo( "str" );
Class bar( foo );   // Copy
使用默认的复制构造函数,它将复制类的成员,在这种情况下,它将复制
存储的
指针,而不是其内容

这就是为什么你需要在这里重新定义


否则,当第一个实例(比如
a
)被破坏时,当您试图访问
b

存储的
成员时,您将有一个未定义的行为。您的类有一个名为
存储的
指针的成员。复制
的实例时:

Class foo( "str" );
Class bar( foo );   // Copy
使用默认的复制构造函数,它将复制类的成员,在这种情况下,它将复制
存储的
指针,而不是其内容

这就是为什么你需要在这里重新定义


否则,当第一个实例(比如
a
)被破坏时,当您试图访问
b

存储的
成员时,您将有一个未定义的行为,他可能指的是隐式定义的复制构造函数,不是您所指的构造函数。他可能指的是隐式定义的复制构造函数,而不是您所指的构造函数。。。。他们还需要一个dtor。这是需要……的一个主要例子。。。。他们还需要一个dtor。这是一个最重要的例子,说明了我们需要。