簡體   English   中英

自定義 Malloc() 函數 :: 這個語法是什么意思?

[英]Custom Malloc() Function :: What Does this Syntax Mean?

我正在使用 nDPI 庫編寫 C 程序,可在此處獲得 (在 Ubuntu 機器上編碼,GCC 編譯器,nDPI 3.2 版)nDPI 用於檢查網絡流量。 代碼使用許多不同的結構來表示網絡內容,例如網絡流、網絡協議、網絡主機等。

所以我覺得如果要創建這些結構體,必須使用庫自定義的malloc()free()函數,這是有道理的。 但是我很難理解函數原型。 以下是 API 頭文件中的幾行相關代碼:

/* Utility functions to set ndpi malloc/free/print wrappers */

void set_ndpi_flow_malloc(void* (*__ndpi_flow_malloc)(size_t size));

void set_ndpi_flow_free(void (*__ndpi_flow_free)(void *ptr));

考慮set_ndpi_flow_malloc()函數。 在源代碼的其他地方,定義了一個struct nDPI_flow_info ,我看到該結構體在代碼中隨處可見。 所以我假設set_ndpi_flow_malloc()是在堆上分配這些結構之一,用一些信息填充它,然后返回指針。

但我不明白這個函數的參數。 如果我不得不猜測,我會說set_ndpi_flow_malloc()接受一個指向另一個函數的指針,稱為__ndpi_flow_malloc() ,並且該函數接受一個size_t整數作為參數。 事實證明,在 API 頭文件的其他地方有這個函數原型:

void * ndpi_flow_malloc(size_t size);

這是一種功能,我需要:我需要__ndpi_flow_malloc()在名字前面的兩個下划線字符)是什么做的那些雙下划線是什么意思?

另一個問題......如果set_ndpi_flow_malloc()是一個自定義的malloc()函數,它不應該返回一個指向分配內存的指針嗎?

另一個問題......我實際上如何在我的代碼中寫這個? 像這樣...?

struct nDPI_flow_info* myFlow;

set_ndpi_flow_malloc( (void*) &ndpi_flow_malloc( sizeof( struct nDPI_flow_info )) );

// ...use the struct...

set_ndpi_flow_free( &ndpi_flow_free* myFlow ) );

那不可能是對的。 我不明白第二行如何返回指針並將其分配給變量myFlow

任何建議或批評都非常感謝。 謝謝!

完全披露:: 我也在這里發布了這個問題。

函數set_ndpi_flow_malloc實際上並不進行分配,但允許您設置進行分配的函數。 它的參數是一個指向一個函數的指針,該函數接受一個size_t並返回一個void * ,並且參數的名稱是__ndpi_flow_malloc

set_ndpi_flow_free 它告訴庫使用哪個函數作為它的自定義自由函數。

最有可能的是, ndpi_flow_malloc是默認的自定義分配器。 因此,如果這是您要使用的,您可以執行以下操作將其設置為自定義分配函數:

set_ndpi_flow_malloc(ndpi_flow_malloc);

然后假設有一個名為ndpi_flow_free的類似默認自由函數,您可以這樣做以將其設置為自定義自由函數:

set_ndpi_flow_free(ndpi_flow_free);

我不熟悉這個 API,但根據你在這里發布的內容,它必須在內部分配內存來執行一些操作,它允許你指定它應該使用哪個分配器/釋放器來做到這一點 - 它可以使用 vanilla mallocfree分配和釋放內存,或者您可以傳遞使用不同分配方案或用於日志記錄/調試或其他任何內容的自定義分配器/釋放器。

為了使這更容易閱讀,我將重命名事物。 基本上假裝我已經完成了

#define SNFM set_ndpi_flow_malloc
#define NFM  __ndpi_flow_malloc

這給我們留下了

void SNFM(void *(*NFM)(size_t size));

讀作

     SNFM                               -- SNFM
     SNFM(                         )    -- is a function taking
     SNFM(        NFM              )    --   parameter NFM
     SNFM(      (*NFM)             )    --   is a pointer to
     SNFM(      (*NFM)(           ))    --     a function taking
     SNFM(      (*NFM)(       size))    --       parameter size
     SNFM(      (*NFM)(size_t size))    --       is a size_t
     SNFM(     *(*NFM)(size_t size))    --     returning a pointer to
     SNFM(void *(*NFM)(size_t size))    --       void
void SNFM(void *(*NFM)(size_t size));   -- returning void

所以基本上, set_ndpi_flow_malloc的參數是一個指向一個函數的指針,該函數接受一個size_t並返回一個指向void的指針 - 即malloc或具有相同簽名的函數執行相同的操作:

set_ndpi_flow_malloc( malloc );

或者

void *my_malloc( size_t size )
{
  ...
}
...
set_ndpi_flow_malloc( my_malloc );

該函數不分配內存; 相反,它是當庫需要在內部分配內存時指定使用哪個分配器的方式。 set_ndpi_flow_free對deallocator 做同樣的事情——你可以使用標准庫中的vanilla free ,或者傳遞一個自定義deallocator:

set_ndpi_flow_free( free );

或者

void my_free( void *ptr )
{
  ...
}
...
set_ndpi_flow_free( my_free );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM