首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在删除指向动态分配对象的指针矢量中的元素之前,我需要做什么?

在删除指向动态分配对象的指针矢量中的元素之前,我需要做什么?
EN

Stack Overflow用户
提问于 2010-10-31 09:21:28
回答 5查看 17.6K关注 0票数 20

我有一个向量,我用指向对象的指针填充。我正在努力学习良好的内存管理,并有几个一般性的问题:

  1. 当我完成向量后,我真的必须遍历它并在每个指针上调用delete吗?
  2. 为什么我不必在没有新语句的情况下对向量或我声明的任何其他变量调用delete,而必须在指针上调用delete ?如果向量是在返回(导致向量超出范围)的函数中声明的,那么C++会为我处理释放指针内存的问题吗?
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-31 09:30:15

  1. Yes
  2. Vectors是使用模板内存分配器实现的,模板内存分配器负责为您管理内存,因此它们有些特殊。但作为一般经验法则,由于堆栈和堆分配之间的差异,您不必对未使用new关键字声明的变量调用delete。如果在堆上分配了内容,则必须将其删除(释放)以防止内存泄漏。
  3. No。在迭代所有元素时,必须显式调用delete myVec[index]

例如:

代码语言:javascript
复制
for(int i = 0; i < myVec.size(); ++i)
   delete myVec[i];

话虽如此,如果你打算在向量中存储指针,我强烈建议使用boost::ptr_vector,它会自动处理删除操作。

票数 24
EN

Stack Overflow用户

发布于 2010-10-31 20:01:56

删除是真的吗?当我完成向量后,我必须遍历它,并在每个指针上调用

嗯,你不需要手动循环,你也可以使用算法:

代码语言:javascript
复制
#include <vector>
#include <algorithm>
#include <memory>

int main()
{
    std::vector<Base*> vec;
    vec.push_back(new Derived());
    vec.push_back(new Derived());
    vec.push_back(new Derived());

    // ...

    std::for_each(vec.begin(), vec.end(), std::default_delete<Base>());
}

如果你没有C++0x编译器,你可以使用boost:

代码语言:javascript
复制
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/construct.hpp>

std::for_each(vec.begin(), vec.end(), boost::lambda::delete_ptr());

或者,您可以编写自己的functor:

代码语言:javascript
复制
struct delete_ptr
{
    template <class T>
    void operator()(T* p)
    {
        delete p;
    }
};

std::for_each(vec.begin(), vec.end(), delete_ptr());
票数 11
EN

Stack Overflow用户

发布于 2010-10-31 09:40:49

如果您有权访问C++0x,也可以使用std::unique_ptr。它取代了不能在容器中使用的过时std::auto_ptr。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4061438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档