【发布时间】:2015-10-03 08:09:44
【问题描述】:
我想将派生自公共接口(抽象类)的类的对象存储在该抽象类的 std::vector 中。这个向量应该在一个循环中填充,通常我会调用一个类的构造函数并将创建的对象推送到向量中。
据我了解,对于抽象类,我只能存储指向该类的指针,因此我需要 push_back 派生类的指针。但是,我不确定这些新创建的对象的范围。
请看下面的代码。这段代码可以编译并且运行良好,但我的问题是:
a) 对象是否保证存在于 main 函数的第二个 for 循环中?或者它们是否会在创建它们的循环范围之外停止存在?
b) 是否调用了所有对象的析构函数或者是否存在内存泄漏?
#include<vector>
#include<iostream>
class Interface {
public:
Interface( int y ) : x(y) {}
virtual ~Interface() {}
virtual void f() = 0;
int x;
};
class Derived_A : public Interface {
public:
Derived_A( int y ) : Interface(y) {}
void f(){ return; }
};
class Derived_B : public Interface {
public:
Derived_B( int y ) : Interface(y) {}
void f(){ return; }
};
int main()
{
std::vector<Interface*> abstractObjects;
int N = 5;
for(int ii = 0; ii < N; ii++ )
{
abstractObjects.push_back( new Derived_A(ii) );
abstractObjects.push_back( new Derived_B(ii) );
}
for(int ii = 0; ii < abstractObjects.size(); ii++ )
{
abstractObjects[ii]->f();
std::cout << abstractObjects[ii]->x << '\t' << std::endl;
}
for(int ii = 0; ii < abstractObjects.size(); ii++ )
{
delete abstractObjects[ii];
}
return 0;
}
【问题讨论】: