我想动态分配一个
int
,然后将相应的指针推入向量中。使用后,我将向量的所有元素设置为nullptr
,但原始指针并没有变成nullptr
。
为什么会出现这种情况?
#include <vector>
int main(void)
{
int* intPtr = new int(1);
printf("%p¥n",intPtr); //(a)
std::vector<int*> ptrVec;
ptrVec.push_back(intPtr);
for(auto* ptr : ptrVec)
{
delete ptr;
ptr = nullptr;
printf("%p¥n",ptr); // (b) =>(nil) as expected.
}
printf("%p¥n",intPtr); //(c) is same with (a), opposite to my expect:(nil)
}
谢谢大家!!
刚才,我明白
intPtr
和 ptrVec[0]
指向同一个地方,但它们是不同的变量,因为 intPtr 在 push_back 时被复制。
为了防止这种情况下的内存泄漏,有以下三种方法。
1.删除向量和原指针的元素。 但对于人为错误来说这是不安全的。
std::vector<int*> ptrVec;
{
int* intPtr = new int(1);
ptrVec.push_back(intPtr);
}
for(auto itr = ptrVec.begin(); itr!=ptrVec.end(); ++itr)
{
delete *itr;
}
ptrVec.clear();
std::vector<int*> ptrVec;
ptrVec.push_back(new int(1));
for(auto itr = ptrVec.begin(); itr!=ptrVec.end(); ++itr)
{
delete *itr;
}
ptrVec.clear();
std::vector<std::shared_ptr<int>> ptrVec;
ptrVec.push_back(std::make_shared<int>(1));
ptrVec.clear();