【发布时间】:2016-06-09 15:16:40
【问题描述】:
我今天一直在思考一个问题,在谷歌上很难找到答案。
我试图了解 STL 容器在处理指向在堆上和堆栈上分配的对象的指针时的行为。
所以,从对象开始,没有指针......想象我有......
std::vector<int> myVec;
while(true)
{
int myInt = 5;
myVec.push_back(myInt);
myVec.pop_back();
}
我的理解是 pop_back() 方法将确保向量中包含的整数被删除,而不仅仅是从容器中删除。因此,如果它运行并进行了十亿次迭代,我不应该期望泄漏内存。我插入的所有内容都将被删除。内存检查显示了这种行为。
现在考虑我使用指针向量(指向堆上的对象)...
std::vector<int*> myVec;
while(true)
{
int * myIntP = new int(5);
myVec.push_back(myIntP);
myVec.pop_back();
}
在这种情况下,每次调用 pop_back() 时只应删除指针本身,并且底层对象保持未删除,从而导致内存泄漏。因此,经过十亿次迭代后,我使用了相当多的内存,即使我的向量中没有条目。
现在,如果我有一个指针向量(指向堆栈上的对象)怎么办...
std::vector<int*> myVec;
while(true)
{
int myInt = 5;
int * myIntP = &myInt;
myVec.push_back(myIntP);
myVec.pop_back();
}
这里的指针指向堆栈对象。他们的内存是否在调用 pop_back() 时被释放?内存检查显示此行为没有内存泄漏。使用的少量内存表明它的行为类似于堆栈上的对象。然而这不是我所期望的,因为如果指针已经从另一个函数传递给我,到堆栈变量,即
void myFunc(int * myIntP)
{
std::vector<int*> myVec;
myVec.push_back(myIntP);
myVec.pop_back();
}
int main()
{
int myInt = 5;
int * myIntP = &myInt;
myFunc(myIntP);
std::cout << (*myIntP) << std::endl;
return 0;
}
然后允许向量释放此内存,将使 myIntP 指向已删除的数据。所以这肯定是不正确的吗?
谁能帮忙解释一下?
还有“指向堆栈上变量的指针”的名称,即没有用“new”初始化?
谢谢
乔伊
【问题讨论】:
-
a
vector仅存储您的结构。如果您的结构是指针,则向量不会检查它是否有效并且不会释放它指向的内存。当你动态分配时,你可能想要使用智能指针,它的析构函数释放分配的内存。 -
尽管有类型,但向量并不知道也不关心指针指向的内容。当您从向量中删除一个时,它会删除指针占用的内存,但 从不 删除它所指向的东西,无论该对象是在堆栈上还是在堆上。
标签: c++ pointers containers heap-memory stack-memory