2

次の2つのヘッダーを含むライブラリを使用するとします。

// types.h
typedef const char* Value;
typedef const char* Key;

// map.h
/** The given name and value will be copied into the map */
void add(struct Map* m, Key key, Value value);

コメントは、char*sのkey内容を意味しvalue、関数によってコピーされ、add返された後に使用するためのポインターを格納しないと想定しています。つまり、呼び出し元の関数は、を呼び出した直後に、これらのポインターを使用して、たとえばfreeingkeyや、など、必要なことをすべて実行できます。valueadd

呼び出し元の関数は、またはaddを変更しないことも期待できます。keyvalue

さて、そのコメントがなく、実装のソースも使用例も利用できなかった場合、経験豊富なCプログラマーはこれらの所有権の問題について何を想定しますか?

4

2 に答える 2

1

何よりもまず、ドキュメントを試して入手することです。APIが動作を文書化しない限り、100%確実にすることはできません。すべての試行が失敗した場合は、次のように想定するのが妥当です。

  1. Key関数は、またはValueとして渡されるため、変更しませんconst
  2. 明示的に言及されていない限り、呼び出し元は関数に渡される変数の所有権を保持し、渡された変数と関数呼び出しの後に必要なことを実行できKeyますValue

また、厳密なテストで仮定を確認する必要があります。

于 2013-01-18T03:15:21.727 に答える
0

個人的には、値をコピーすることを期待しています。そうでない場合、ローカル変数で使用するのは非常に危険です。

また、マップの場合、すべての要素とそれらがどのように割り当てられているかを追跡し、コピーが行われない場合はマップを解放した後に自分で解放する必要があります。

于 2013-01-18T03:19:27.963 に答える