1

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

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

4 回答 4

3

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

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

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

于 2013-07-23T11:42:43.290 回答
2

您所做的不是从复制Object1pObject2指向的内容,而是将指针pObject2 指向Object1从而丢失分配的内存。

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

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

*pObject2 = Object1;

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

ClassName<T>* pObject2 = new ClassName<T>(Object1);
于 2013-07-23T11:41:39.363 回答
1

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

*pObject2 = Object1;

pObject2是一个指针。如果您分配它,您将使其指向Object1,忘记指向过程中动态创建的实例的指针。

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


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

于 2013-07-23T11:41:31.493 回答
1

就像其他人说的那样,您应该使用定义复制构造函数,或重载赋值运算符。然后,您需要做的就是:

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

或者,

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

当然,为了确保您不会修改原始文件,您可能需要阅读深拷贝与浅拷贝

于 2013-07-23T11:56:13.813 回答