按现有对象初始化动态分配的对象

时间:2013-07-23 11:39:05

标签: c++ visual-studio-2010 visual-c++

如何通过现有对象(相同的类对象)分配动态分配的对象而不更改后者。代码,似乎不起作用:

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

4 个答案:

答案 0 :(得分:3)

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

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

在您的代码段中,首先为Object2分配值,然后立即将其丢弃。此外,您甚至会覆盖指针本身,从而通过为其指定Object1的地址而不是将其内容分配给指向的内存来创建内存泄漏。

答案 1 :(得分:2)

您正在做的是Object1复制到pObject2指向的内容,而只是指针pObject2 指向Object1,从而丢失了你分配的内存。

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

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

*pObject2 = Object1;

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

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

答案 2 :(得分:1)

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

*pObject2 = Object1;

pObject2是一个指针。如果你指定它,你将它指向Object1,忘记指向过程中动态创建的实例的指针。

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


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

答案 3 :(得分:1)

与其他人一样,您应该使用定义copy constructor或重载赋值运算符。然后,您需要做的就是:

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

,或者

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

当然,为了确保您不会修改原件,您可能需要阅读deep copy vs. shallow copy