2016-06-16 1 views
-1

map<int,int>を作成するとクリアできますが、それでもメモリに残りますか?例えば。C++でマップを破棄してマップポインタを設定するにはどうすればよいですか?

#include <map> 
using namespace std; 

int main(){ 

    map<int,int> myMap; 
    myMap[1] = 2; 
    myMap.clear(); 

return 0; 
} 

しかし、私たちが代わりに実際のmapのポインタを設定している場合、私はdeleteでそれを破壊できましたが、私はマップを同じように取り込むことができませんでした:

myMap[1] = 2;ライン端をコメント解除
#include <map> 
using namespace std; 

int main(){ 

    map<int,int> *myMap = new map<int,int>; 
    // myMap[1] = 2; 
    delete myMap; 

return 0; 
} 

エラー:

[email protected]:~$ g++ test.cpp test.cpp: In function ‘int main()’: test.cpp:8:14: error: no match for ‘operator=’ (operand types are ‘std::map’ and ‘int’) myMap[1] = 2; ^ In file included from /usr/include/c++/5/map:61:0, from test.cpp:2: /usr/include/c++/5/bits/stl_map.h:296:7: note: candidate: std::map<_Key, _Tp, _Compare, _Alloc>& std::map<_Key, _Tp, _Compare, _Alloc>::operator=(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = int; _Tp = int; _Compare = std::less; _Alloc = std::allocator >] operator=(const map& __x) ^ /usr/include/c++/5/bits/stl_map.h:296:7: note: no known conversion for argument 1 from ‘int’ to ‘const std::map&’

C++でmapをどのように破壊するのですか?それは "破壊的"なのだろうか?

また、map<>ポインタの値を初期化/設定するにはどうすればよいですか?

+3

'(* MYMAP)[1] = 2;あなたが 'new'を使うと、そのトリックを行います。残りの部分はCinCoutにあります。 – GMichael

+1

同じ理由 'int * i = new int(0); i + = 5; delete i; 'はintに5を加えません。 – immibis

+0

* "マップ'を作成した場合、それをクリアすることはできますが、それでもメモリに残っていますよね? "*、マップ管理オブジェクト自体は(おそらく1〜2ダースです32ビットまたは64ビットのアプリケーションをコンパイルし、 'map'実装がデバッグをサポートするためにデータを追加したかどうかを確認します)、アプリケーションによって再利用するために保存された' map'データ要素のメモリは解放されます。概して、マップ上で「クリア」以上のことをする価値はほとんどありません。これは、格納されていた要素が使用されていたメモリにハングアップしがちな「ベクトル」と対照的です。 –

答えて

3

How do I destruct a map in C++?

オブジェクトとして宣言すると(最初のケース)、スコープから外れると破棄されます。

newを使用すると、ポインタとして宣言すると、deleteキーワードがトリックになります。スマートポインタを使用する場合は、明示的にdeleteを呼び出す必要はありません。

How do I initialize/populate the values of a map<> pointer?

このように、insert()メソッドを使用します。@Michaelにより示唆されるように、あなたが(*myMap)[1] = 2;を使用することができます。しかし、私はAPIを使用して好む、

#include <map> 
using namespace std; 

int main(){ 

    map<int,int> *myMap = new map<int,int>; 
    myMap->insert(make_pair<int, int>(1, 2)); 
    delete myMap; 

return 0; 
} 

か。

注:コメントに指摘されているように、std::mapの場合、operator[]insert()の動作は似ていません。この最小の例では、違いを反映していないということだけです。

+0

'insert'と' operator [] 'は同じセマンティクスを持ちません。 – juanchopanza

+0

^この文脈でどのように影響しますか? – CinCout

+0

その重要な詳細を省略すると、答えは同等であることを示し、そうでないことを示します。 – juanchopanza

0

std::mapがポインタを使用せずに(最初の最小限まで)使用しているメモリを解放するには、いくつかの方法があります。

まず明確な慣用であり、あなたが空の一時マップとスワップを作成することにより、(スワップ)作業マップとその内容最小化:他の方法は、の範囲を制御することです

std::map<int,int>().swap(myMap); // memory reset to minimum 

を内部範囲{}を使用している地図です。

int func() 
{ 
    { // <- start an internal scope for the map 

     std::map<int,int> myMap; 

     // use the map 

    } // <- let the map go out of scope when done using it 

    // carry on without the map 
} 

あなたは(最高の回避)のポインタを使用する必要がある場合、あなたはそのよう*を使用して間接参照へのポインタを必要とする:

(*myMap)[key] = value; 
関連する問題