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。这是一个最重要的例子,说明了我们需要。