删除矢量指针的最佳方法?

时间:2012-06-01 18:28:24

标签: c++ visual-c++

  

可能重复:
  how to properly delete pointer?

我正在使用std::vector将一组对象放入其中供以后使用,我使用DETAIL* pPtr = new DETAIL创建指针,然后将其插入到矢量中。

DETAIL的结构

struct DETAIL {
    int nRef;
    short sRandom;
};

这是删除和删除矢量中指针的最佳方法,不会留下内存泄漏的空间吗?

while(Iter1 != m_Detail.end())
{
    if((*Iter1)->nRef == m_SomeVar)    
    {
        delete  *Iter1;
        m_Detail.erase(Iter1);
        break;
    }

    Iter1++;
}

5 个答案:

答案 0 :(得分:9)

不要将原始指针放入vector,而是使用智能指针,例如std::shared_ptr。然后就不需要delete,只需erase来自vector的指针,指针对象就会被自动删除。

答案 1 :(得分:0)

我的建议是使用std :: shared_ptr使用erase从vector中删除共享指针,并让它处理deallocation。但是,您正在做的事情没有任何问题,但擦除不会导致向量释放它分配用于保持指针的空间。您可以使用shrik_to_fit删除分配的空间。

答案 2 :(得分:0)

  

我正在使用DETAIL* pPtr = new DETAIL来创建指针

这是你的第一个错误,你正在获取资源(来自freestore的内存和在该内存中构造的对象),而不是初始化将取得所有权并保证取消分配所获资源的对象。解决第一个错误的成语称为Resource Acquisition Is Initialization

应该是这样的:

std::shared_ptr<DETAIL> pPtr(new DETAIL);

或者更好:

std::shared_ptr<DETAIL> pPtr = std::make_shared<DETAIL>();

或者在C ++ 03中将std::shared_ptr替换为boost::shared_ptr(和boost::make_shared

下一个错误是delete *Iter1;,因为几乎所有在析构函数之外使用delete的代码都是错误的(并且所有代码在析构函数之外使用delete并伴随着一个关于如何避免内存泄漏的问题肯定是错误的。)如果你使用RAII成语,你不需要使用delete,因为它会在合适的时间自动发生。

另外,为什么你的班级叫DETAIL?而Detail又出了什么问题?

答案 3 :(得分:0)

我不喜欢像“永远不会”这样的答案,所以我会回答,但是会给你一些技巧来绕过释放矢量而不释放内容的风险。

如果我理解你有一个细节指针的矢量:

std::vector<DETAIL*> details;

所以你想要一个方法来删除和删除所有引用某个m_SomeVar的尖头对象:(现在我们假设它是一个自由函数)

void free_references(int reference, std::vector<DETAIL*> & vector)
{
    std::vector<DETAIL*>::iterator it = vector.begin();

    while (it != vector.end())
    {
        if ((*it)->nRef == reference)
        {
            delete *it;
            // erase() makes the original 'it' in an unknown state which can't be used
            // erase will return a valid iterator which is, in this case, the following element
            it = vector.erase(it); 
        }
        else
        {
            ++it;
        }
    }
}

正如我在您的代码中所理解的,向量是类的成员。这是好的,因为你将能够删除析构函数中的所有内容。

但是,我会在这里使用std::unique_ptr来“赋予”指向vector中unique_ptr容器的指针的所有权。当向量内存空闲时,std::unique_ptr智能点确保释放拥有的指向对象。

答案 4 :(得分:-2)

我不知道我是否完全理解它,但你是否试过使用ZeroMemory宏?