gnu拡張機能のクリーンアップがパラメーターなしで機能する理由

スティーブン

最近、gnuCでクリーンアップ属性を使用してC ++でスマートポインターを実装する方法についての記事を読んでいます。

#define autofree __attribute__((cleanup(free_stack)))

__attribute__ ((always_inline))
inline void free_stack(void *ptr) {
    free(*(void **) ptr);
}

そして例を使用して:

int main(void) {
    autofree int *i = malloc(sizeof (int));
    *i = 1;
    return *i;
}

私の質問は次のとおりです。

  • パラメータをに渡す必要がないのはなぜfree_stackですか?

  • なぜfree(*(void **) ptr)働くのですか?なぜそれがキャストされvoid**、参照解除されるのかわかりません

アフシン

ここでは、この属性の定義は次のとおりです。

cleanup (cleanup_function)

変数がスコープ外になると、cleanup属性が関数を実行しますこの属性は、自動関数スコープ変数にのみ適用できます。静的保存期間のあるパラメーターまたは変数には適用できません。関数は、変数と互換性のある型へのポインターという1つのパラメーターを取る必要があります関数の戻り値(存在する場合)は無視されます。

にパラメータを渡す必要はありません。free_stack()これは、自動変数がその変数へのポインタを引数としてスコープ外に出るたびに呼び出されるためです。

でメモリを割り当てmalloc()ているので、解放する必要のあるポインタがあります。したがって、クリーンアップ関数に渡される引数は、実際にはポインター(またはvoid**(*(void**)ptr)へのポインターであり、解放する必要のあるポインターに到達するために使用する必要があります。コードでiは、スコープ外なると次のコードが実行されると考えることができます

free_stack(&i);

更新:

クリーンアップ機能はメモリを解放することを意味しないことを覚えておいてください。それはクリーンアップを意味します。たとえば、次のクリーンアップ方法を使用して、スコープ外のときにファイルを閉じることができます。

#define autoclose __attribute__((cleanup(auto_close_file)))

__attribute__ ((always_inline))
inline void auto_close_file(void *ptr) {
    fclose(*(FILE**) ptr);
}

int main(void) {
    autoclose FILE *fp = fopen("test.txt", "w");
    fputs("Hello World", fp);
    return 0;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

パラメータ パック拡張がラムダで機能しない

Chrome拡張機能のポップアップウィンドウでアラートが機能しない

テンプレートパラメータパックが機能しないのはなぜですか?

android.app.applicationを拡張するアプリケーションクラスが機能しないのはなぜですか?

WatchKit拡張機能内でアプリグループが機能しないのはなぜですか?

アスタリスク: 拡張機能の「パラメータ」について少し混乱しています

拡張機能でジェネリック型パラメーターを宣言する

Chrome拡張機能のコンテンツスクリプトのランタイムにonMessageがなく、接続してメッセージを送信するだけなのはなぜですか

Chrome拡張機能の背景ページが非アクティブになると、拡張機能が2回のクリックで実行されます

ゲッターメソッドが拡張ループで機能しない

アプリストアでスタンドアロンメッセージ拡張機能をリリースする場合、iOSアプリのスクリーンショットが必要ですか?

アプリケーションのバージョンアップデートの場合、Androidで共有拡張機能が機能しない

adbディープリンクトリガーが特定のパラメーターで機能しない

[]ボタンChrome拡張機能のループチェックが機能しない

拡張機能のジェネリックパラメータに制約を追加する

この拡張メソッドがジェネリックスで機能するのに、セットベースタイプでは機能しないのはなぜですか?

異なるパッケージでWebSecurityConfigurerAdapterクラスを拡張する際に、カスタムセキュリティが機能していません

Safariでクリップパスグラデーションアニメーションが機能しない

iPhoneのメッセージアプリで動作するiOS8アプリの拡張機能/拡張機能の種類はありますか?

ステッカーパック拡張機能と既存のiOSアプリに異なるバンドル識別子を設定できますか?

MongoDB集約ルックアップが複数のパラメーターで機能しない

タスクモジュールとURLが機能しないMicrosoftTeamsActionメッセージング拡張機能

ラッパークラスでポストインクリメントが機能する理由

.NET Coreオプションの構成がジェネリック型パラメーターで機能しないのはなぜですか?

等しい(=)。なぜ原始的な拡大は機能するが、ラッパーは機能しないのですか?

拡張機能が機能しない:引数がゼロのコンストラクターがない

android-1つのパラメーター拡張関数でkotlinifixが機能しない

android-1つのパラメーター拡張関数でkotlinifixが機能しない

Chrome拡張機能のバックグラウンドページでクリックイベントが機能しない

TOP 一覧

  1. 1

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  2. 2

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  3. 3

    CSSのみを使用して三角形のアニメーションを作成する方法

  4. 4

    ドロップダウンリストで選択したアイテムのQComboBoxスタイル

  5. 5

    ZScalerと証明書の問題により、Dockerを使用できません

  6. 6

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  7. 7

    Windows 10でのUSB入力デバイスの挿入/取り外しの検出

  8. 8

    Excel - count multiple words per cell in a range of cells

  9. 9

    PictureBoxで画像のブレンドを無効にする

  10. 10

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  11. 11

    スタート画面にシャットダウンタイルを追加するにはどうすればよいですか?

  12. 12

    Python / SciPyのピーク検出アルゴリズム

  13. 13

    Luaの文字列から特定の特殊文字を削除するにはどうすればよいですか?

  14. 14

    Pythonを使用して、リストからデータを読み取り、特定の値をElasticsearchにインデックス付けするにはどうすればよいですか?

  15. 15

    LinuxでPySide2(Qt for Python)をインストールするQt Designerはどこにありますか?

  16. 16

    goormIDEは、ターミナルがロードするデフォルトプロジェクトを変更します

  17. 17

    QGISとPostGIS(マップポイント(米国の地図上にraduisを使用した緯度と経度)

  18. 18

    MLでのデータ前処理の背後にある直感

  19. 19

    ターミナルから「入力ソースの変更」ショートカットを設定する

  20. 20

    パンダは異なる名前の列に追加します

  21. 21

    同じクラスの異なるバージョンを使用したクラスローディング:java.lang.LinkageError:名前の重複クラス定義を試行しました

ホットタグ

アーカイブ