通过已存在的对象初始化动态分配的对象
Initialize an dynamically allocated object by already existing object
如何在不更改后一个对象的情况下,通过现有对象(同一类对象)来分配动态分配的对象。代码,似乎不起作用:
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重新初始化它。
相关文章:
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 销毁C++中动态分配的内存(数组对象)
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- 动态分配的对象未初始化
- std::p air 会破坏其动态分配的对象吗?
- 动态分配对象中的字段-动态分配更好还是静态分配更好?C++
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 使用私有析构函数删除动态分配的对象
- 动态分配许多 Boost::直方图对象
- 如何使用每个对象的单个构造函数参数动态分配C++对象数组?
- 将动态分配对象传递到 boost::any 构造函数中
- 将动态分配的对象添加到对象指针数组中
- 如何删除列表中的动态分配类对象<T>?
- 处理另一个类中类动态分配的对象数组
- 如何使用一些参数初始化动态分配的数组中的对象
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 如何复制或返回包含动态分配的内存的对象
- C 删除指向动态分配对象的指针