指针和指针指向的指针

时间:2012-07-28 09:17:11

标签: c winapi function memory pointers

更新:抱歉,这是一个很大的错误。写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)),使用TCHARTCHAR*操纵并返回LPTSTR类型的值。

3 个答案:

答案 0 :(得分:2)

你不分配任何内存,所以你不必担心内存被释放。当您的vaiables超出范围时,它们将自动释放。在这个功能

 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;

正在寻找麻烦。您正在为指针变量分配整数值。您可能应该重新考虑上面的代码。

答案 1 :(得分:2)

  1. 是的,指针a保持不变,直到我们从主函数返回
  2. 变量b(4字节指针)是自动的。每次调用test函数时都会创建它。一旦我们从它返回,变量就会消失(指针)。请注意,b点的值不受影响。
  3. 否。在大多数情况下,我认为,在编译期间只会分配一个块(很可能在只读内存中),并且该函数将在每次调用时返回相同的指针。
  4. 如果SetTabToolTipText使用一些内存管理工具new / malloc或某些特定于操作系统的内部分配字符串,则应该进行额外的清理。否则会有内存泄漏。

    如果内部没有发生这种情况(文档或注释等中没有提及),则很可能将指针返回到您通常用作只读的内部缓冲区。在这种情况下,不应该担心内存消耗的增加。

答案 2 :(得分:0)

指针应该包含地址...所以int* a = 3是没有意义的......在函数中你没有为int分配内存(只有par变量,然后在函数结束时销毁),你分配用于在int* b中存储地址的存储器,当功能结束时,该存储器也可以自由存放。