当我运行这段简单的代码时,我很难理解我得到的输出
#include <vector>
#include <iostream>
#include "LxUNIXsys.h"
using namespace std;
int main(int argc, char** argv) {
//memory management class
LxUNIXsys mem_manager;
vector <double*> vec;
mem_manager.DumpMemoryInfo();getchar();
for(int i =0; i < 3; i++) vec.push_back(new double (3));
for(int i =0; i < vec.size(); i++) cout << *vec[i] << endl;
mem_manager.DumpMemoryInfo();getchar();
for(int i =0; i < vec.size(); i++) delete vec[i];
vec.clear();
for(int i =0; i < 3; i++) cout << *vec[i] << endl;
cout <<"size of vec " <<vec.size() << endl;
mem_manager.DumpMemoryInfo();
return 0;
}
LxUNIXsys 是我用于内存转储的一个类,我从中调用的方法是:
void LxUNIXsys::DumpMemoryInfo() {
pid_t id = getpid();
// cout << "id = " << id << endl;
stringstream ss("");
ss << "pmap -d " << id << " | grep private ";
// cout << ss.str().c_str() << endl;
cout << "Memory dump: [pid = " << id << " ] " << flush; system(ss.str().c_str());
}
我得到的输出是:
Memory dump: [pid = 17012 ] mapped: 51476K writeable/private: 7452K shared: 0K
3
3
3
Memory dump: [pid = 17012 ] mapped: 51480K writeable/private: 7456K shared: 0K
3
3
3
size of vec 0
Memory dump: [pid = 17012 ] mapped: 51480K writeable/private: 7456K shared: 0K
所以,基本上我删除了指针,不仅信息仍然存在,而且我可以在clear()
.
我也尝试过删除 vec usingdelete[]
但结果是一样的。
PS:我知道智能指针的存在,但我想知道为什么这段代码没有达到预期的效果。
PPS:我知道未定义的行为,忘记清除后的访问,我只想要一种有效的方法来立即释放内存,比如删除常规指针时。