基礎的な質問だと思うのですが気になったため質問します.
#1:vectorのメモリについて
関数内で使用されたvectorのメモリは自動的に開放されるのでしょうか?
c++
1int main(){ 2 3std::vector<double> a; 4 5return 0; 6}
上記のコードのaは何かしらの処理をしたほうが良いのでしょうか?
#2:デストラクタとvectorについて
vectorをclass内で使用した場合,デストラクタでswap関数?を使用してメモリの解放をしろみたいなことを聞きました.なぜ,そのようなことを行わなければならないのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
std::vector
で使われるメモリはローカル変数だろうがデータメンバであろうがデストラクトされればきちんと開放されます。
生のポインタを入れると、ポインタが指す先を自動的に開放などしてくれないので、コードを書く人がきちんと管理する必要があります。
cpp
1std::vector<Foo*> foo_list; 2foo_list.push_back(new Foo()); 3// foo_list がデストラクトされても上の行でnewしたFooはデストラクトされない
std::vector
の要素数がいったん大きくなると、要素数が減っても要素を格納するバッファのサイズは自動的には縮まらず、メモリを消費し続けます。std::vector
が長く生存する場合にはこのメモリ消費が問題になることがあるかもしれません。
要素数が0になったときにこのバッファを開放するために、C++ 11 より前は、
std::vector<T>().swap(long_live_list);
とするテクニックがありました。C++ 11 以降では、shrink_to_fit() を呼べばよいです。
これはlong_live_list
をデストラクトする直前に行う必要はありません。
投稿2021/06/26 14:38
総合スコア21695
0
vectorをclass内で使用した場合,デストラクタでswap関数?を使用してメモリの解放をしろみたいなことを聞きました.なぜ,そのようなことを行わなければならないのでしょうか?
それはメンバ変数の場合の事を言っているのではないでしょうか。
例えばゲームのユーザが所持しているアイテム一覧を表示するダイアログ(ItemListDialog)の中で、
std::vector<Item> mItemsをメンバ変数として持っているとします。
cpp
1class Item { 2pubic: 3 int id; 4 std:string name; 5}; 6 7class ItemListDialog { 8public: 9 ItemListDialog (); 10 virtual ~ItemListDialog (); 11 static ItemListDialog* create(const std::vector<Item>& items); 12 13private: 14 std::vector<Item> mItems; 15}; 16 17 18ItemListDialog::~ItemListDialog() { 19 mItems.clear(); 20 mItems.shrink_to_fit(); 21}
この場合、mItemsはデストラクタでメモリを開放する必要があると思います。
投稿2021/06/26 06:23
総合スコア4207
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/26 07:33
2021/06/26 14:53
2021/06/26 16:43
2021/06/26 17:40
0
関数内で使用されたvectorのメモリは自動的に開放されるのでしょうか?
開放されます。
vectorをclass内で使用した場合,デストラクタでswap関数?を使用してメモリの解放をしろみたいなことを聞きました.なぜ,そのようなことを行わなければならないのでしょうか?
初耳です。その情報の出どころは?
投稿2021/06/26 05:48
総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/26 11:27
2021/06/26 11:29
2021/06/26 17:38
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/27 06:49