2

次の構造定義があります。

struct  info_link {
    char                url[100];
    http_response       *(*worker)(http_request *request, char *arguments);
    long                url_length;
};

ご覧のとおり、「worker」は関数ポインタです。
今、私は次の機能を持っています:

http_response   *info_show_providers(http_request *request, char *arguments) {
    char        *test = new char[100];
    long        i = 5;
}

そして、次のように、1 つのメンバーを含む単純な info_link 配列を定義します。

info_link       internal_links[] = {
                {"/show_providers", info_show_providers, 15}
};

私は電話しようとしています:

internal_links[0].worker(x,x);

プログラムは「info_show_providers」関数にアクセスしますが、「new char [100]」関数で毎回失敗します。
SIGABRT をスローします。

関数ポインタの呼び出し方が間違っているのではないでしょうか? またはスタックを破損しますか?
それはどのように適切に行われるべきですか?

4

1 に答える 1

1

ヒープが破損している場合、Glibc の malloc は SIGABRT を上げることができます。次の 2 つのシナリオが思い浮かびます。

1) シグナルハンドラを使用しています (malloc を呼び出すべきではありません)。

2) 他の場所でメモリ破損が発生し、ヒープが破壊されました (例: オーバーフロー/アンダーフローはヒープ破損の一般的な原因です)。

于 2013-07-31T21:21:31.650 に答える