特に、格納されたオブジェクトが他のオブジェクトから継承されている場合に、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が破壊されないのですか?オブジェクトはスライスされましたか?