为什么向量中的原始指针不会变成nullptr? [重复]

问题描述 投票:0回答:1

我想动态分配一个

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)
}
c++ stl stdvector raw-pointer
1个回答
0
投票

谢谢大家!!

刚才,我明白

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();

  1. 直接push_back时新的原始指针。您只需删除向量的元素即可。

std::vector<int*> ptrVec;
ptrVec.push_back(new int(1));

for(auto itr = ptrVec.begin(); itr!=ptrVec.end(); ++itr)
{
    delete *itr; 
}
ptrVec.clear();

  1. 使用shared_ptr

std::vector<std::shared_ptr<int>> ptrVec;
ptrVec.push_back(std::make_shared<int>(1));

ptrVec.clear();

© www.soinside.com 2019 - 2024. All rights reserved.