この単純なコードを実行したときに得られる出力を理解するのに少し苦労しています
#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 を使用して削除しようとしましdelete[]
たが、結果は同じです。
PS: スマート ポインターの存在は知っていますが、このコードが期待どおりに動作しない理由を知りたいです。
PPS: 未定義の動作については知っています。クリア後のアクセスについては忘れてください。通常のポインターを削除するときのように、すぐにメモリを解放する効果的な方法が必要です。