2016-07-01 19 views
4

のように、OpenSSLで動作するには、usingステートメントとunique_ptrを使用します。コードがなければ、コードは実際には醜くなり、私はgotoステートメントのファンではありません。unique_ptrとOpenSSLのSTACK_OF(X509)*

これまでのところ、コードをできるだけ変更しました。ここで私が使用しているものの例は、以下のとおりです。

using BIO_ptr = std::unique_ptr<BIO, decltype(&::BIO_free)>; 
using X509_ptr = std::unique_ptr<X509, decltype(&::X509_free)>; 
using EVP_PKEY_ptr = std::unique_ptr<EVP_PKEY, decltype(&::EVP_PKEY_free)>; 
using PKCS7_ptr = std::unique_ptr<PKCS7, decltype(&::PKCS7_free)>; 
... 

BIO_ptr tbio(BIO_new_file(some_filename, "r"), ::BIO_free); 

今私はSTACK_OF(X509)の必要性を持っており、これはunique_ptrでも可能であるならば、私は、知りません。私は以下のようなものを探していますが、これは機能しません。

using STACK_OF_X509_ptr = std::unique_ptr<STACK_OF(X509), decltype(&::sk_X509_free)>; 

私はまた、ファンクタを試してみました:

struct StackX509Deleter { 
    void operator()(STACK_OF(X509) *ptr) { 
     sk_X509_free(ptr); 
    } 
}; 

using STACK_OF_X509_ptr = std::unique_ptr<STACK_OF(X509), StackX509Deleter>; 

STACK_OF_X509_ptr chain(loadIntermediate(cert.string())); 

コンパイラはこれと、アプリケーションの実行を受け付けます。ただ一つの質問:上記のように他のunique_ptrsでは、私は常に第二引数を指定していたので、私は私が何か行方不明です賭け:

STACK_OF_X509_ptr chain(loadIntermediate(cert.string()), ??????); 

どのように私はC++ unique_ptrとOpenSSLのSTACK_OF(X509)*を使うのですか?

+1

は、おそらくそこにエラーメッセージましたか?レプリケートに使用できるコンパイル可能なコードスニペットですか? – wally

+2

提供しているDeleterが、必要なDeleterプロトタイプに準拠していません。あなたは 'unique_ptr :: pointer'を引数として受け取り、内部的に' sk_X509_free'を起動する独自のデアロケータ(functor)を書く必要があります。それで 'std :: unique_ptr ;'を使うことができます。 – jweyrich

+0

@jweyrich、私はそれを理解していると思います:-) Functorはoperator()のようなものですか?この演算子を定義してクラスを書く必要がありますか?あなたは私のための例がありますか? Please :-) –

答えて

4

私は通常の関数を定義した:

void stackOfX509Deleter(STACK_OF(X509) *ptr) { 
    sk_X509_free(ptr); 
} 

は、その後、私は私のコードでそれを使用します。

using STACK_OF_X509_ptr = std::unique_ptr<STACK_OF(X509), 
    decltype(&stackOfX509Deleter)>; 

STACK_OF_X509_ptr chain(loadIntermediate(cert.string()), 
        stackOfX509Deleter); 
+0

ところで、ラムダでこれを行うにはいいですね。しかしこれは余分な質問です;) –

関連する問題