gpt4 book ai didi

c++ - 存储在 ptr_vector 中的派生类未被破坏

转载 作者:太空宇宙 更新时间:2023-11-03 10:35:47 25 4
gpt4 key购买 nike

试图找到使用 ptr_vector 存储、访问和释放对象的最佳方法,尤其是当存储的对象是从其他对象继承时(ptr_vector 不应该有对象切片的任何问题)。但是当运行下面的程序时,令人惊讶的是派生类没有被破坏。有人知道为什么吗?

#include <boost/ptr_container/ptr_vector.hpp>
#include <iostream>
#include <boost/ptr_container/ptr_map.hpp>
#include <boost/foreach.hpp>
using namespace std;

class A
{
public:
int id;
A() {cout<<"Constructed A()"<<endl;}
A(int i):id(i) {cout<<"Constructed A"<<i<<endl;}
~A() {cout<<"* Destructed A"<<id<<endl;}
};
class B:public A
{
public:
int i;
B() {cout<<"Constructed B"<<endl;}
B(int ii):i(ii) {id=ii;cout<<"Constructed B"<<i<<endl;}
~B() {cout<<"* Destructed B"<<i<<endl;}
};

class zoo
{
boost::ptr_vector<A> the_animals;
public:
void addAnimal(A* a) {the_animals.push_back( a );}
void removeAnimal(int id) {the_animals.release(the_animals.begin()+id); }
void removeOwnership(int id) {the_animals.release(the_animals.begin()+id).release();}
};

int main()
{
zoo z;
z.addAnimal( new B(0) );
//delete abc;z.addAnimal(abc);//doing this will cause heap corruption
B* lion=new B(1);
z.addAnimal(lion);
z.removeOwnership(1);
delete lion;
z.removeAnimal(0);
}//main

程序的输出是:

Constructed A()
Constructed B0
Constructed A()
Constructed B1
* Destructed B1
* Destructed A1
* Destructed A0

为什么 B0 没有被销毁?对象被切片了吗?

最佳答案

基类的析构函数不是虚函数:

 ~A() {cout<<"* Destructed A"<<id<<endl;}

应该是:

 virtual ~A() {cout<<"* Destructed A"<<id<<endl;}

为什么?参见 When should your destructor be virtual?

关于c++ - 存储在 ptr_vector 中的派生类未被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3969113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com