c - 指针和指针指向的对象

标签 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.

最佳答案

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

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

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

关于c - 指针和指针指向的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11699768/

相关文章:

c - 理解函数参数中的指针

关于 char 数组的说明

javascript - 检查多个函数是否为真,然后做一些事情

function - 从弹出窗口调用后台函数

c - 如何在 Linux 中调试 FUSE 文件系统崩溃

c - netsnmp_gethostbyname_v4 行为

c++ - 将结构从一个进程转移到另一个进程的最佳方法?

c# - 如何从不同应用程序的窗口控件中读取数据?

windows - WinAPI:InternetCloseHandle 函数关闭句柄但不关闭连接

javascript - 通过链接触发 Javascript 函数的看似正确的方法,不起作用