【问题标题】:pointer and which is pointed by the pointer指针和指针所指向的
【发布时间】:2012-07-26 20:07:05
【问题描述】:

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

在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-&gt;gWin.At(tabIndex)),它使用TCHARTCHAR* 进行操作并返回LPTSTR 类型的值。

【问题讨论】:

  • 对不起,这只是一个错字。 test() 返回一个指向 int 的指针。
  • TCHAR和TEXT的定义是什么?你的问题很困惑。 a 和 b 只是名称;它们没有被“删除”,它们超出了范围。没有“内存块”,只有一个字符串文字“aaa”,每次都从测试返回(假设 TEXT 只是一个 noop 或一个演员)。
  • 你发布的代码格式很糟糕,语法不正确;发布真实代码并正确缩进。至于SetTabToolTipText是否分配内存,需要阅读其规范。
  • @Jim,我的问题是,如果我每次使用字符串“aaa”,它都会分配内存。如果您能指出为什么代码格式如此糟糕,我们将不胜感激。

标签: c winapi function memory pointers


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

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

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

【讨论】:

  • @Negai:在SetTabToolTipText中,如果我使用TCHAR *b = TEXT("text")return b会怎样?我想我应该在这种情况下做一些清理工作,对吧?
  • 不,不是。通常编译器将字符串“text”放到只读数据段中,只要你的代码中有 TEXT("text"),这仅仅意味着你得到一个指向在编译期间保留在程序中的区域的指针.因此,不需要清理——“文本”已经在生成的二进制文件中。
【解决方案2】:

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

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

你没有返回值,即使函数说它会返回一个int,所以你应该像这一行那样做

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

您将test() 返回的值分配给a。还有

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

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

【讨论】:

    【解决方案3】:

    指针应该包含地址...所以int* a = 3 是毫无意义的...并且在函数中您不为 int 分配内存(仅用于 par 变量,然后在函数结束时销毁),您为将地址存储在int* b,当函数结束时该内存也空闲。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 2017-09-03
      • 2011-08-04
      • 2013-01-04
      • 2011-04-26
      相关资源
      最近更新 更多