2013-04-05 80 views
0

我想要一个矢量来保存它将拥有的一些对象的指针。删除矢量管理的资源

这里是矢量:

private: std::vector<fppVirtual*> m_fapps;

我已经创建的元素是这样的:

m_fapps.push_back(new fpp1(renderingEngine)); //fpp* are subclasses of fppVirtual 
    m_fapps.push_back(new fpp2(renderingEngine)); 
    m_fapps.push_back(new fpp3(renderingEngine)); 

由于m_fapps是另一个类的载体实例变量,我要确保一流的破坏者正确清理了m_fapps

 for (int i=0, size=m_fapps.size();i<size;++i){ 
     delete m_fapps[i]; 
     } 

这是可以接受的内存管理技术吗?我认为这个循环是需要的,因为当它的拥有类被销毁时向量超出范围时,只有指向这些对象的指针才会被删除,对吧?

+0

你的矢量是如何声明的? – 2013-04-05 06:40:07

+3

是的。但看看'std :: unique_ptr'而不是这样做。 – Yuushi 2013-04-05 06:40:53

+0

@KirilKirov更新问题 – johnbakers 2013-04-05 06:42:10

回答

2

由于没人给你直接的答案了 - 是的,这是可以接受的,这是为了释放此内存的唯一途径,具有vector的这一声明。

这可以并且应该避免,使用智能指针,@OliCharlesworth建议或使用一些其他容器,由@BjörnPollexponited。

+0

谢谢你实际提供了一个问题的答案。 – johnbakers 2013-04-05 06:45:27

1

您应该改用boost::ptr_vector。界面是一样的,但它为你处理内存管理。 See this question有关是否使用ptr_vectorvector<shared_ptr<>>的一些准则。

+2

或'vector >',这可能是一个更好的默认选择,因为在OP代码中没有共享所有权的指示。 – juanchopanza 2013-04-05 06:44:59

+0

正确,我仍然停留在C++ 03上。 – 2013-04-05 06:47:45

3

这有效(有一些注意事项),但不被认为是惯用的C++,这是很好的理由。

您应该强烈考虑使用智能指针向量(或智能向量,如boost::ptr_vector),以避免必须执行手动内存管理。

这也可以免费为您提供异常安全,并且还可以避免您的外部类可复制时发生的令人讨厌的所有权问题。

+0

我倾向于与其他建议,一致认为'矢量<的unique_ptr >'是天作之合,如果我没有其他的理由在自己的项目 – johnbakers 2013-04-05 06:48:00

+1

@SebbyJohanns提升:如果你想寻找进入Boost多一点,我相信你会找到很多理由将它包含在你的项目中。 – 2013-04-05 06:48:48

+0

@SebybyJohanns:当然,标准库中现在有许多智能指针类型,选择最适合您的用例的类型。 – 2013-04-05 06:51:23