C++复制具有多态性的指针向量
C++ Copying vector of pointers with polymorphism
我正在编写的代码要求我保留两种类型的对象(例如类Derived1
和类Derived2
)的集合,这两种类型具有相同的基类(例如类Base
)。基类还有一个纯虚拟函数,它在这两个派生类中都有实现。
我使用基类(即vector<*Base> myCollection
)的对象的点向量来跟踪所有这些对象。然而,我经常需要复制这个向量。
我试图在基类中创建一个复制函数,以便创建Derived1
或Derived2
的其他实例。然而,我注意到了一些奇怪的行为。
以下是这种行为的示例:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class A
{
public:
int member;
string name;
A(int x, string str = "Base"): member(x), name(str) {}
A* CreateCopy()
{
A tmp = A(member); // tmp: member = 77, name = "Base"
return &tmp; // &tmp: member = 77, name = ""
}
};
class B : public A
{
public:
B(int x) : A(x, "Derived Class") {}
};
int main()
{
A* ptr = &B(77); // &tmp: member = 77, name = ""
B test(77); // test: member = 77, name = "Derived Class"
A* ptr2 = &test; // *ptr2: member = 77, name = "Derived Class"
A* newPtr = ptr->CreateCopy(); // *newPtr: member = 77, name = ""
return 0;
}
当我创建一个对象B
并在同一行上分配该对象的引用时,我将失去名称成员的正确性。但是,当我创建对象,然后指定它的引用时,它就可以工作了。不幸的是,我的CreateCopy()
方法也遇到了同样的问题。
这里发生了什么,复制指针向量的最佳方法是什么?是否可以在不使用new
运算符的情况下执行复制?使用此运算符时似乎更容易发生内存泄漏。
对于A* ptr = &B(77);
,B(77)
是一个临时对象,它将在表达式完成时被销毁,然后ptr
将成为一个挂起的指针。
对于
A* CreateCopy()
{
A tmp = A(member); // tmp: member = 77, name = "Base"
return &tmp; // &tmp: member = 77, name = ""
}
tmp
是一个局部变量,当超出函数范围时,它将被销毁,这意味着CreateCopy()
将返回一个挂起的指针。
是否可以在不使用"new"操作符的情况下执行复制?使用此运算符时似乎更容易发生内存泄漏。
您可以使用智能指针来避免手动内存管理。例如std::unique_ptr或std::shared_ptr。
相关文章:
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 如何更改唯一指针向量的可见性
- 如何在基类指针向量的元素上应用重载的多态函数
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 包含指向其他结构的指针向量的结构
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 如何将字符串指针数组转换为字符串类型的智能指针向量?
- 初始化可变数据结构中的共享指针向量
- 指向具有 decltype 的函数的指针向量
- push_back指向指针向量的指针
- 使用指针向量(带代码)C++(以及对其使用的便利性的怀疑)时出现问题
- 我可以做些什么来改进指针向量中的此搜索?
- 指向指针排序向量的指针向量的 C++ 向量
- 初始化用户定义类的指针向量
- 函数无法识别我在C++传递节点指针向量?
- 如何声明指向类对象的指针向量?
- 指向结构的指针向量的元素具有相同的地址
- 删除指向抽象类的指针向量
- 当我返回指向结构的指针向量时出现段错误
- 用基于范围的for循环填充指针向量