删除后的c ++指针仍然占用内存

时间:2019-02-17 05:33:21

标签: c++

我的c ++指针有问题。

这是我的代码:

#include <iostream>
#include <vector>

int main() {
    std::vector<int*> * data = new std::vector<int*>;

    for (int i = 0; i < 1000; i++) {
        data->push_back(new int[100000]);
    }

    for (int i = 0; i < 100; i++) {
        delete data->at(i);
    }

    data->clear();
    delete data;
    data = nullptr;
    return 0;
}

之后

std::vector<int*> * data = new std::vector<int*>;
for (int i = 0; i < 1000; i++) {
    data->push_back(new int[100000]);
}

需要384Mb(我在任务管理器中找到了它)

但是之后

for (int i = 0; i < 100; i++) {
    delete data->at(i);
}

仍然需要346Mb

之后

delete data;
data = nullptr;

它什么都不会改变

我的问题是,我该怎么做才能完全删除指针和空闲内存?

1 个答案:

答案 0 :(得分:0)

首先,您可能实际上并未删除所有内容。您的循环次数只有100,而您要推送1000个项目。其次,您对data->clear()的使用是毫无意义且无关紧要的。无论您做什么,向量都永远不会收缩。即使他们这样做,您还是要删除它。

最后,请勿使用newdelete,而应谨慎使用原始指针。如果您一开始就没有使用它们,那么您就不会犯错。您应该这样做:

#include <iostream>
#include <vector>
#include <memory>

int main() {
    using ::std::make_unique;
    using ::std::unique_ptr;
    typedef unique_ptr<int []> ary_el_t;
    auto data = make_unique<::std::vector<ary_el_t>>();

    for (int i = 0; i < 1000; i++)
    {
        data->push_back(make_unique<int[]>(100000));
    }

    data.reset();

    return 0;
}

而且,即使您这样做了,您仍然可能无法找回内存。当分配者要求更多空间时,它们将重用已释放的空间,但它们通常不会将其返回给操作系统。

上面的代码确实需要C ++ 14才能工作。但是最新版本的Visual Studio应该支持这一点。我在Linux机器上使用g ++对此进行了测试,并且分配器的确将内存返回给了操作系统,因此我能够验证所有取消分配的确有效。