多态对象和unique_ptr的向量

问题描述 投票:0回答:1

我正在尝试做一项作业,并决定这次正确管理内存,但最终问题多于答案。我想要一个父类的子向量,例如

vector<Parent> list
,据我所知,我需要使用指针来避免切片我的对象,所以
vector<Parent*>

然后我了解了 C++ 中的智能指针,还了解了调用父类的析构函数时可能发生的潜在内存泄漏(可能是由于智能指针超出范围之类的原因)。我不知道编写类以避免内存泄漏的正确方法是什么,我写了一个我所处位置的示例,这是打印“This is A”,我认为这意味着如果析构函数要由指针会导致内存泄漏。

public:
    virtual void funct(){
        cout << "This is A" << endl;
    }
};
class B : public A{
public:
    void funct(){
        cout << "This is B" << endl;
    }
};

int main() {
    B b;

    auto ptr = make_unique<A>(b);

    ptr.get()->funct();

    return 0;
}

从评论中获取信息,这是否足以导致内存泄漏,这意味着如果我删除唯一指针 ptr,是否会释放为 B 分配的内存?

class A{
public:
    virtual void funct(){
        cout << "This is A" << endl;
    };
    virtual ~A() = default;
};
class B : public A{
public:
    void funct() override{
        cout << "This is B" << endl;
    }
    
    ~B() override = default;
};

int main() {
    B b;

    unique_ptr<A> ptr = make_unique<B>(b);

    ptr->funct();

    return 0;
}
c++ polymorphism unique-ptr virtual-destructor
1个回答
0
投票

为了确保从智能指针(实际上是任何分配的对象)正确释放内存,您只需要确保基类析构函数被标记为虚拟。

class A
{
public:
    A() {}
    virtual ~A() = default;
    virtual void func() {};
};

class B : public A
{
public:
    B() {}
};

class C : public B
{
public:
    C() {}
    void func() override {}
};

auto obj = std::make_unique<C>();

obj
超出范围时,它将正确释放内存。您甚至不需要在其他类中指定析构函数,因为它们已经获得了默认析构函数。不过,基类需要标记为虚拟,所以这就是为什么你需要在基类中指定析构函数。

© www.soinside.com 2019 - 2024. All rights reserved.