C++复制具有多态性的指针向量

C++ Copying vector of pointers with polymorphism

本文关键字:指针 向量 多态性 复制 C++      更新时间:2023-10-16

我正在编写的代码要求我保留两种类型的对象(例如类Derived1和类Derived2)的集合,这两种类型具有相同的基类(例如类Base)。基类还有一个纯虚拟函数,它在这两个派生类中都有实现。

我使用基类(即vector<*Base> myCollection)的对象的点向量来跟踪所有这些对象。然而,我经常需要复制这个向量。

我试图在基类中创建一个复制函数,以便创建Derived1Derived2的其他实例。然而,我注意到了一些奇怪的行为。

以下是这种行为的示例:

#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。