0

それぞれの型コンストラクタを呼び出すnewによるメモリ割り当てと、 mallocによるメモリ割り当てはそうではないことが知られています。しかし、kmalloc はどうでしょうか。

いくつかのシステム コールを開発しようとしていますが、以下の構造体にメモリを割り当てる必要があります。

struct mailbox{
    unsigned long existing_messages;
    unsigned long mxid;
    struct message *msg;
    struct message *last_node;
    mailbox(){
        existing_messages = 0;
        mxid = 0;
        msg = NULL;
        last_node  = NULL;
    }
};

kmallocでメモリを割り当てると、割り当て時に構造体メールボックスのコンストラクタが呼び出されますか? そうでない場合、コンストラクターを明示的に呼び出す以外に、コンストラクターを呼び出す合理的な方法は何ですか。カーネルのメモリ割り当てに新しい機能と同等の機能はありますか?

4

1 に答える 1

2

kmalloc はコンストラクターを呼び出しません。

C++ での 1 つの方法は、"placement new" を呼び出すことです。

例:

void* ptr = malloc( sizeof(T) );

T* p = 新しい (ptr) T(); //メモリ内にオブジェクトを構築

注: オブジェクト自体のメモリ リークを回避するには、デストラクタを明示的に呼び出してから、このメモリの対応する割り当て解除ルーチンを呼び出す必要があります。

p->~T(); //デストラクタを呼び出す

無料 (ptr); //空きメモリ

于 2014-09-08T03:33:26.963 に答える