stdlib の free() 関数は stl 変数では機能しません。stl (ベクトル、マップ、セットなど) によって保持されているスペースの割り当てを解除する一般的な方法はありますか?
3 に答える
free
C 関数であり、デストラクタを呼び出しません。そのため、C++ ではほとんどの場合間違っています。delete
C++ と同等です。
それでも、ここで何をすべきかは、「STL 変数」の意味によって異なります。C++ 標準ライブラリ オブジェクトを意味する場合は、C++ のオブジェクトの割り当てを解除するのと同じ方法でそれらの割り当てを解除します。
オブジェクトを手動でメモリ管理しなかった場合は、何もしません。
int main() { std::vector<int> v{0,1,2}; }
でオブジェクトを作成して手動でメモリ管理する場合は、 ;
new
を使用できます。delete
int main() { std::vector<int>* ptr = new std::vector<int>(); ptr->push_back(0); ptr->push_back(1); ptr->push_back(2); delete(ptr); } // (PLEASE don't do this)
new[]
配列内でオブジェクトを作成して手動でメモリ管理する場合は、 を使用しますdelete[]
。int main() { std::vector<int>* ptr = new std::vector<int>[1]; ptr[0].push_back(0); ptr[0].push_back(1); ptr[0].push_back(2); delete[](ptr); } // (PLEASE don't do this either)
ただし、ケース 2 と 3 では、実際には代わりにstd::unique_ptr
orなどのスマート ポインターを使用する必要がありstd::shared_ptr
ます。手動のメモリ管理が悪い!
C++ 標準ライブラリ コンテナー内の要素を手動でメモリ管理しようとしないでください。コンテナーはこれらを所有しており、必要に応じて既にそれらのメモリを解放しています。
int main()
{
std::vector<int> v{0,1,2};
delete &v[0];
} // (So, so wrong)
STL オブジェクトは、自身の割り当て解除を自動的に処理します。STL オブジェクトがスコープ外になると、必要な割り当て解除を行うデストラクタが実行されます。フレデリック・ハミディがコメントで指摘したように、ヒープへの割り当ての場合は、自分でオブジェクトの割り当てを解除する必要があります。C++ では、C の malloc/free の組み合わせではなく、new/delete を使用することをお勧めします。