如何在不改变后者的情况下通过已有的对象(同一个类对象)分配一个动态分配的对象。代码,这似乎不起作用:通过已有的对象初始化一个动态分配的对象
ClassName<T> Object1(parameters);
...
ClassName<T>* pObject2 = new ClassName<T>(parameters);
pObject2 = &Object1;
...some operations on pObject2
delete pObject2
如何在不改变后者的情况下通过已有的对象(同一个类对象)分配一个动态分配的对象。代码,这似乎不起作用:通过已有的对象初始化一个动态分配的对象
ClassName<T> Object1(parameters);
...
ClassName<T>* pObject2 = new ClassName<T>(parameters);
pObject2 = &Object1;
...some operations on pObject2
delete pObject2
你在做什么是Object1
不复制到什么pObject2
点,而不是你只要把指针pObject2
点到Object1
,从而失去你分配的内存。
这会导致你试图释放你没有分配的内存,当你指定delete
指针时,这是未定义的行为,并且很可能会导致崩溃。
你想要做的就是使用提领操作*
上的指针pObject2
,来获取对象的指针指向,并分配给对象,而不是:
*pObject2 = Object1;
或者使用当分配类的拷贝构造函数:
ClassName<T>* pObject2 = new ClassName<T>(Object1);
谢谢Joachim,它解决了这个问题。 –
您正在分配指针。您需要分配内容:
*pObject2 = Object1;
pObject2
是一个指针。如果指定它,则指向Object1
,忘记指向过程中动态创建的实例的指针。您需要分配实例*pObject2
。这将调用ClassName<T>::operator=
,它可以自动生成以分配所有成员,也可以手动编写,以便为该类型进行其他任何正确的操作。
编辑:当然,作为圭多Kanschat中的其他问题来实现,而这是发生了什么事你尝试,你真的应该直接使用拷贝构造函数。无论如何,当你要用object1重新初始化它时,为什么用任意垃圾初始化第二个对象。
假设你有一个拷贝构造函数:
ClassName<T>* pObject2 = new ClassName<T>(Object1);
在您的代码片段中,您首先将值分配给Object2,这些值立即丢弃。此外,您甚至会覆盖指针本身,从而导致内存泄漏,方法是为其分配Object1的地址,而不是将其内容分配给指向的内存。
当然!为什么要初始化第二个实例,如果要用对象1重新初始化它... –
这是正确的方法。然而,这并不是最好的答案,因为它没有告诉OP他的尝试有什么问题。 –
谢谢你们。轨道上的轻轨,OP有什么问题? –
像其他人一样,你应该使用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阅读起来。
** N.B。**您正在询问_assignment_,而不是_initialisation_。 –
好吧,轻轨在轨道上的比赛,我改变了它的问题。 –