更新:抱歉,犯了个大错。写成 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))
,它使用TCHAR
和TCHAR*
进行操作并返回一个类型的值LPTSTR
.
最佳答案
- 是的,指针 a 一直保留到我们从主函数返回
- 变量 b(一个 4 字节指针)是自动的。每次我们调用测试函数时都会创建它。一旦我们从它返回,变量就会消失(指针)。请注意,b 点的值不受影响。
- 没有。我认为,在大多数情况下,在编译期间只会分配一个 block (很可能在只读内存中)并且该函数将在每次调用时返回相同的指针。
如果 SetTabToolTipText
使用一些内存管理工具 new/malloc 或一些操作系统特定的工具在内部分配一个字符串,您应该进行额外的清理。否则会发生内存泄漏。
如果内部没有发生类似的事情(文档或评论等中未提及),它很可能返回指向您通常用作只读的某个内部缓冲区的指针。在这种情况下,不必担心内存消耗增加。
关于c - 指针和指针指向的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11699768/