C++でC-APIを実装していて、C++のようなデータ構造をC-APIの既存のデータ構造に変換する必要があります。'new'を連続して使用したときの割り当て失敗時のメモリリークを防ぐ方法
私はデータ構造のメモリを担当していますので、私は新しいものと削除することができますが、私の理解から、次のC++ 11コードはメモリリークを起こすことがあります(これはちょっと落とした例です):
#include <string>
#include <new>
struct container {
char *message;
};
/* converts an std::string to a C data structure */
container *create_container(const std::string& message) {
container *c = nullptr;
try {
container *c = new container;
c->message = new char[message.length() + 1];
message.copy(c->message, message.length());
c->message[message.length()] = '\0';
} catch (std::bad_alloc exception) {
return nullptr;
}
return c;
}
void destroy_container(container *c) {
if (c != nullptr) {
if (c->message != nullptr) {
delete[] c->message;
}
delete c;
}
}
int main(void) {
container *c = create_container("message");
destroy_container(c);
return 0;
}
c->message
の割り当てに失敗した場合は、c
がリークします。
私の質問:理想的にこの状況に対処する必要がありますか?私がこれまでに思い付いた何
:
/* ... */
} catch (std::bad_alloc exception) {
if (c != nullptr) {
delete c;
}
return nullptr;
}
/* ... */
はC++でこれを行うには良い方法はありますか?
メモリはnew
とdelete
で管理されており、std::bad_alloc
をキャッチ同じtry
ブロックで二回new
を使用することが起こるならば、この問題は、C++アプリケーションだけで発生する可能性があります。
スマートポインタなどの方法で解決できますか?
'auto c = std :: make_unique(); ...; return c.release(); '異常終了時に' container'は自動的に解放されます。 –
"これをC++で行うより良い方法はありますか?" charの配列ではなく、std :: stringを使用します。 –
@NeilButterworthこの設定では、 'container'はC APIに渡されるCスタイルのデータ構造体です。この演習のポイントは、境界上のC++クラスとC PODの間の変換です。 –