1

更新:对不起,只是一个大错误。写是没有意义的,int *a = 3;但是请想想这个案例的类比TCHAR *a = TEXT("text");(我编辑了我的问题,所以有些答案和评论很奇怪,因为它们是针对我不适合的原始问题的)

在 main 函数中,假设我有一个指针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)),它使用 and 操作TCHARTCHAR*返回一个类型的值LPTSTR

4

3 回答 3

2

您不分配任何内存,因此您不必担心内存被释放。当您的变量超出范围时,它们将被自动释放。在这个函数中

 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 回答
2
  1. 是的,指针 a 一直保留到我们从主函数返回
  2. 变量 b(一个 4 字节指针)是自动的。每次我们调用测试函数时都会创建它。一旦我们从它返回,变量就会消失(指针)。请注意,b 点的值不受影响。
  3. 不,在大多数情况下,我认为在编译期间只会分配一个块(很可能在只读内存中),并且函数将在每次调用时返回相同的指针。

如果SetTabToolTipText使用一些内存管理工具 new/malloc 或一些特定于操作系统的内部分配一个字符串,则应该进行额外的清理。否则会出现内存泄漏。

如果内部没有发生这样的事情(文档或评论等中没有提到),它很可能会将指针返回到您通常用作只读的某个内部缓冲区。在这种情况下,不必担心内存消耗增加。

于 2012-07-28T09:31:10.707 回答
0

指针应该包含地址......所以int* a = 3一些没有意义的东西......并且在函数中你不为 int 分配内存(仅用于 par 变量,然后在函数结束时销毁),你分配内存来存储地址int* b,这个内存功能结束时也免费。

于 2012-07-28T09:20:47.003 回答