C++ には RAII というイディオムがあります。これが意味することは、クリーンアップについて心配する必要がなく、コード内の定義されたポイントでリソースが解放されるということです。
たとえば、関数で配列を作成し、それを返します。以下は、RAII を使用しない典型的な実装の 1 つです (もう 1 つは、メモリを割り当てて渡す呼び出し元です)。
int *makeIntArray(std::size_t length) {
return new int[length];
}
ここで、呼び出し元はこのメモリを解放することを覚えておく必要があります。これを RAII バージョンと比較します。
std::vector<int> makeIntArray(std::size_t length) {
return std::vector<int>(length);
}
これから返されるものは、ベクトルがスコープ外になるとメモリの割り当てが解除されますが、これは呼び出し元次第です。size()
また、要素数を取得するメンバー関数なども提供します。
そうは言っても、可能であれば動的に割り当てられないようにするのが最善です。たとえば、構造体を返す必要がある場合はStr
、値で返すだけです。
Str makeStr() {
return Str();
}
std::unique_ptr
動的割り当てがないということは、メモリを解放するか、何か (この場合のようなスマート ポインター) にラップするかどうかにかかわらず、余分な作業がないことを意味します。
他のライブラリについては、ドキュメントを読んで、それが返すものを所有していることを確認する必要があります。必要に応じて、できることの 1 つは、そこから RAII オブジェクトを作成することです。例えば:
int *makeSomeInt(int value) {
return new int(value);
}
...
std::unique_ptr<int> myInt(makeSomeInt(5));
//memory freed when myInt goes out of scope