暗号化タスクを実行するアプリケーションを開発しています。これらのタスクには OpenSSL を使用し、インターフェイスは のインターフェイスに似ていますlibcurl
。よくわからない場合は、次のようになります。
conf_func(handle, ENUM_OPTION, value);
したがって、インスタンスでENUM_OPTION
toで表されるオプションを設定します。それのドキュメントを読むと、すべての値がコピーされ(特に明記されている場合を除く)、したがって割り当てたものを解放し、割り当てたものを解放すると書かれています。value
handle
libcurl
これは私のアプリケーションで行うには良い考えかもしれないと思いました。必要なメモリ量は増えますが、確実に使いやすくなります。しかし、ここで問題に直面します。次のコードを想定します。
X509 *cert = X509_new();
X509 *cert_copy = malloc(sizeof(X509));
memcpy(cert_copy, cert, sizeof(X509));
もちろん、これは問題を引き起こします。これは浅いコピーにすぎず、解放すると問題が発生します。検索した結果、ディープ コピーは OpenSSL によってネイティブに提供されておらず、望ましくない可能性がある (メモリ使用量) と判断しました。
したがって、私は別のアプローチを取りました: 渡されたポインターをコピーするのではなく、保存するだけです。
X509 *cert = X509_new();
X509 *cert_copy = cert;
X509_free(cert_copy);
これにより、メモリ フットプリントが削減され、開発が容易になります。一方、これは文書化の必要性と特別な使用法への認識を高めます: あなたが割り当てますが、私はあなたのために無料で提供します.
それで、私はこの動作を一貫して提供する必要があると思いましたか? しかし、その後、文字列に問題が発生します。
char *s = "Some text";
char *s_copy = s;
free(s_copy);
これs
は定数であり、ヒープに割り当てられていないため機能しません。
したがって、私のジレンマがあります。文字列をコピーする必要がありますが、OpenSSL 構造体をコピーする必要はありません。これをきれいに解決するにはどうすればよいですか?それを文書化し、ユーザーがインターフェースを正しく使用することに頼っていますか? それとも、私が見逃している完全に明白なものがありますか?
注: 私を解放するということは、使用の最後に一般的な破棄機能があることを意味します。それ以外の場合は、ポインターがNULL
解放されているかどうかを確認するだけです。