2013-07-23 87 views
1

如何在不改变后者的情况下通过已有的对象(同一个类对象)分配一个动态分配的对象。代码,这似乎不起作用:通过已有的对象初始化一个动态分配的对象

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

** N.B。**您正在询问_assignment_,而不是_initialisation_。 –

+0

好吧,轻轨在轨道上的比赛,我改变了它的问题。 –

回答

2

你在做什么是Object1复制到什么pObject2点,而不是你只要把指针pObject2Object1,从而失去你分配的内存。

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

你想要做的就是使用提领操作*上的指针pObject2,来获取对象的指针指向,并分配给对象,而不是:

*pObject2 = Object1; 

或者使用当分配类的拷贝构造函数:

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

谢谢Joachim,它解决了这个问题。 –

1

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

*pObject2 = Object1; 

pObject2是一个指针。如果指定它,则指向Object1,忘记指向过程中动态创建的实例的指针。您需要分配实例*pObject2。这将调用ClassName<T>::operator=,它可以自动生成以分配所有成员,也可以手动编写,以便为该类型进行其他任何正确的操作。


编辑:当然,作为圭多Kanschat中的其他问题来实现,而这是发生了什么事你尝试,你真的应该直接使用拷贝构造函数。无论如何,当你要用object1重新初始化它时,为什么用任意垃圾初始化第二个对象。

3

假设你有一个拷贝构造函数:

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

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

+0

当然!为什么要初始化第二个实例,如果要用对象1重新初始化它... –

+0

这是正确的方法。然而,这并不是最好的答案,因为它没有告诉OP他的尝试有什么问题。 –

+0

谢谢你们。轨道上的轻轨,OP有什么问题? –

1

像其他人一样,你应该使用define a copy constructor,或者重载赋值运算符。然后,所有你需要做的是以下几点:

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

,或者

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

当然,以确保您不会修改原来的,你可能想在deep copy vs. shallow copy阅读起来。