通过已存在的对象初始化动态分配的对象

Initialize an dynamically allocated object by already existing object

本文关键字:对象 动态分配 初始化 存在      更新时间:2023-10-16

如何在不更改后一个对象的情况下,通过现有对象(同一类对象)来分配动态分配的对象。代码,似乎不起作用:

ClassName<T> Object1(parameters);
...
ClassName<T>* pObject2 = new ClassName<T>(parameters);
pObject2 = &Object1;
...some operations on pObject2
delete pObject2

假设您有一个复制构造函数:

ClassName<T>* pObject2 = new ClassName<T>(Object1);

在代码片段中,首先将值分配给Object2,这些值将立即被丢弃。此外,通过为指针分配Object1的地址,而不是将其内容分配给所指向的内存,您甚至会覆盖指针本身,从而造成内存泄漏。

您所做的不是从Object1复制到pObject2指向的位置,而是使指针pObject2指向Object1,从而丢失分配的内存。

这将导致您在delete指针时尝试释放尚未分配的内存,这是未定义的行为,很可能会导致崩溃。

您要做的是在指针pObject2上使用取消引用运算符*,以获取指针指向的对象,并将其分配给该对象:

*pObject2 = Object1;

或者在分配时使用类的复制构造函数:

ClassName<T>* pObject2 = new ClassName<T>(Object1);

正如其他人所说,您应该使用define复制构造函数,或者重载赋值运算符。然后,你所需要做的就是:

ClassName<T>* pObject2 = new ClassName<T>(Object1);

或者,

ClassName<T>* pObject2 = new ClassName<T>(parameters);
*pObject2 = Object1;

当然,为了确保你不会修改原件,你可能想阅读深度复制与浅层复制。

您正在分配指针。您需要分配内容:

*pObject2 = Object1;

pObject2是一个指针。如果分配它,则会使它指向Object1,从而忘记指向进程中动态创建的实例的指针。

相反,您需要分配实例*pObject2。这将调用ClassName<T>::operator=,它要么是自动生成的以分配所有成员,要么希望是手动编写的以执行其他适合该类型的操作。


编辑:当然,正如Guido Kanschat在另一个问题中意识到的那样,虽然这就是你的尝试的问题所在,但你真的应该直接使用复制构造函数。为什么要用任意垃圾初始化第二个对象,而无论如何都要用对象1重新初始化它。