1

プレーンなcにunique_ptrを適応させることは可能ですか?

malloc/free を呼び出すときに自家製の「コンストラクタ/デストラクタ」への呼び出しをシミュレートする方法がある場合は、おそらく?

それは実行可能ですか?それともただのばかげた考えですか?

4

4 に答える 4

6

「スマート ポインター」の要点は、破棄時に特定のタスクを自動的に実行することです。C にはデストラクタがないため、明示的な関数呼び出し以外にこれを達成する方法はありませんが、C ではすでにメモリの割り当てを解除しています。

解放する必要のあるポインターのリストを作成し、1 回の関数呼び出しでそれらすべてを同時に実行することができます。

于 2012-04-23T14:21:06.567 に答える
3

いいえ、普通の C ではありませんcleanup。GCC 属性で同様のことができます (標準ではありません)。

#include <stdio.h>

void scope_leaving(int* p) 
{
    printf("Leaving scope.\n");
    // this is essentially your "destructor"
}

int main(int argc, char* argv[]) 
{
    printf("Before x is declared.\n");
    {
        int x __attribute__((cleanup (scope_leaving)));
        x = 42;
    }
    printf("Scope was left.\n");
}

ご想像のとおり、出力は次のようになります。

x が宣言される前。
スコープを離れます。
スコープが残されました。

これにより、 の RAII セマンティクスをエミュレートするポインターを実装できますunique_ptr。おそらくマクロを使用して宣言を簡単にすることができます。それ以上のものがありますがunique_ptr、あなたの質問からは、RAII 以外の側面が必要かどうかわかりません。

于 2012-04-23T14:35:28.233 に答える
2

void(*)()2 回目の読み取りでは、C 構造体がポインターで始まるのを妨げるものは何もありません。custom_malloc(size_t size, void(*deleter)()ポインタを設定するがある場合は、custom_free(void*)後でそのデリータを呼び出すことができます。virtualこれは、C++のデストラクタに似ています。ただし、 の 2 番目の部分std::unique_ptrdelete'd コピー コンストラクターです。Cではそれを行うことはできません。

于 2012-04-23T14:25:53.673 に答える
0

unique_ptrを実装するには、次の2つが必要です。

  1. 所有権を譲渡する代入演算子。
  2. unique_ptrがスコープ外になったときのデストラクタ。

(1)を実装するには、Cでは関数のオーバーロードが許可されていないため、自分で「統制」し、常にカスタム割り当て関数またはマクロを呼び出す必要があります。Cは、常に所有権を譲渡するように強制することはできません。

(2)に関しては、GCCは拡張機能を提供します。変数がスコープから外れると呼び出される「クリーンアップ」関数を割り当てることができます。これを使用して、unique_ptrのデストラクタを実装できます。

于 2012-04-23T14:26:09.147 に答える