C++ 指针容器

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 位整数的处理没有什么不同。就他们而言,指针只是另一个数字。因此,如果您将指针插入到容器中,则您有责任将其删除。