我的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;
它什么都不会改变
我的问题是,我该怎么做才能完全删除指针和空闲内存?
答案 0 :(得分:0)
首先,您可能实际上并未删除所有内容。您的循环次数只有100,而您要推送1000个项目。其次,您对data->clear()
的使用是毫无意义且无关紧要的。无论您做什么,向量都永远不会收缩。即使他们这样做,您还是要删除它。
最后,请勿使用new
和delete
,而应谨慎使用原始指针。如果您一开始就没有使用它们,那么您就不会犯错。您应该这样做:
#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 ++对此进行了测试,并且分配器的确将内存返回给了操作系统,因此我能够验证所有取消分配的确有效。