1

更新:申し訳ありませんが、大きな間違いです。書いても無意味ですがint *a = 3;、例えで考えてみてくださいTCHAR *a = TEXT("text")。(質問を編集したため、適切ではない元の質問に対するものであるため、一部の回答とコメントは奇妙です)

メイン関数では、ポインターがあるとしますTCHAR *a = TEXT("text");。次に、次のコードを実行します。

int i;
for (i = 0; i < 1000; i++) {
        a = test(i);
}

関数は次のようTCHAR* test(int par)に定義されます。

TCHAR* test(int par)
{
    TCHAR *b = TEXT("aaa");
    return b;
}

私の質問は、上記のコードを実行した後、プログラムが終了する前に、メモリ内で:

    1. the pointer `a` remains?
    2. The 1000 pointers `b` are deleted each time the function test(...) exits ?
    3. But there are still 1000 memory blocks there?

実際、私の質問は、TCS_TOOLTIPS スタイルのタブ コントロールでマウスがタブ項目の上にあるときにツールチップを表示する次のコードから動機付けられています。

case WM_NOTIFY
    if (lpnmhdr->code == TTN_GETDISPINFO) {
    LPNMTTDISPINFO lpnmtdi;
    lpnmtdi = (LPNMTTDISPINFO)lParam;

    int tabIndex = (int) wParam; // wParam is the index of the tab item.

            lpnmtdi->lpszText = SetTabToolTipText(panel->gWin.At(tabIndex));
            break;
    }

呼び出すたびにメモリ使用量が増加するかどうかを考えています

SetTabToolTipText(panel->gWin.At(tabIndex))で操作しTCHARTCHAR*型の値を返しますLPTSTR

4

3 に答える 3

2
  1. はい、ポインター a はメイン関数から戻るまで残ります
  2. 変数 b (4 バイトのポインター) は自動です。テスト関数を呼び出すたびに作成されます。そこから戻ると、変数は消えます (ポインター)。b が指す値は影響を受けないことに注意してください。
  3. ほとんどの場合、コンパイル時に割り当てられるブロックは 1 つだけであり (ほとんどの場合、読み取り専用メモリ内)、関数は呼び出しごとに同じポインターを返します。

SetTabToolTipTextメモリ管理機能 new/malloc または OS 固有の機能を使用して文字列を内部に割り当てる場合は、追加のクリーンアップを行う必要があります。そうしないと、メモリリークが発生します。

内部でこのようなことが起こらない場合 (ドキュメントやコメントなどで言及されていない場合)、通常は読み取り専用として使用する内部バッファーへのポインターを返している可能性があります。この場合、メモリ消費量が増加する心配はありません。

于 2012-07-28T09:31:10.707 に答える
2

メモリを割り当てないので、メモリが解放されることを心配する必要はありません。vaiable が範囲外になると、それらは自動的に解放されます。この関数では

 int test(int par)
 {
    int *b = par;
 }

関数が を返すと言っているにもかかわらず、戻り値がintないため、おそらくこの行のようにそうする必要があります

for (i = 0; i < 1000; i++) {
    a = test(i);
}

aによって返される値に割り当てますtest()。また

int* a = 3;
int* b = par;

トラブルを求めています。ポインター変数に整数値を代入しています。おそらく、上記のコードを再考する必要があります。

于 2012-07-28T09:27:47.827 に答える
0

ポインターにはアドレスが含まれている必要があります...int* a = 3つまり、意味のないものです...そして、関数ではintにメモリを割り当てません(関数が終了すると破棄されるpar変数のみ) int* b、このメモリにアドレスを格納するためのメモリを割り当てますまた、関数が終了すると無料になります。

于 2012-07-28T09:20:47.003 に答える