Joe*_*y O 0 c++ containers pointers heap-memory stack-memory
我今天一直在思考一个问题,在google上很难找到答案。
在处理指向在堆上和堆栈上分配的对象的指针时,我试图了解 STL 容器的行为。
所以,从对象开始,没有指针......想象我有......
std::vector<int> myVec;
while(true)
{
int myInt = 5;
myVec.push_back(myInt);
myVec.pop_back();
}
Run Code Online (Sandbox Code Playgroud)
我的理解是 pop_back() 方法将确保删除向量中包含的整数,而不仅仅是从容器中删除。因此,如果它运行并进行了 10 亿次迭代,我不应该期望内存泄漏。我插入的所有内容都将被删除。内存检查显示了这种行为。
现在考虑我使用一个指针向量(指向堆上的对象)......
std::vector<int*> myVec;
while(true)
{
int * myIntP = new int(5);
myVec.push_back(myIntP);
myVec.pop_back();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,每次调用 pop_back() 时只应删除指针本身,并且底层对象保持未删除状态,从而导致内存泄漏。因此,经过十亿次迭代后,我使用了相当多的内存,即使我的向量中没有条目。
现在,如果我有一个指针向量(指向堆栈上的对象)怎么办...
std::vector<int*> myVec;
while(true)
{
int myInt = 5;
int * myIntP = &myInt;
myVec.push_back(myIntP);
myVec.pop_back();
}
Run Code Online (Sandbox Code Playgroud)
这里的指针指向堆栈对象。他们的内存是否在调用 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;
}
Run Code Online (Sandbox Code Playgroud)
然后允许向量释放此内存,将使我的 myIntP 指向已删除的数据。所以这肯定不是正确的吗?
谁能帮忙解释一下?
是否还有“指向堆栈上变量的指针”的名称,即未使用“new”初始化?
谢谢
乔伊
小智 5
while(true)
{
int myInt = 5;
int * myIntP = &myInt;
myVec.push_back(myIntP);
myVec.pop_back();
}
Run Code Online (Sandbox Code Playgroud)
实际上这里只有一个 intmyInt值,值为 5。循环将重复使用相同的值。您将指向该 int 的指针推入向量中,然后将其删除。没有其他事情发生。没有内存泄漏,因为您没有分配新的整数。
STD 容器对指针的处理与对 32/64 位整数的处理没有什么不同。就他们而言,指针只是另一个数字。因此,如果您将指针插入到容器中,则您有责任将其删除。