我正在使用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++;
}
答案 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宏?