- 论坛徽章:
- 0
|
问个菜鸟级的问题,关于new和delete
>;>;在函数pcToLowerChar里new 了个指针变量pcReturn,在该函数返>;>;回前已经delete掉了,但程序执行的结果却返回正确。
>;>;这是否可以认为指针变量pcReturn在delete之后仍然存在呢?否则怎么>;>;会有正确的结果返回呢?
>;>;大侠们能帮我解释一下吗?
还是基本概念的问题,delete只是宣布new出来的内存不再有效,也就是指针的指向不再有效,你返回的是指针的值,是new出来在堆里的地址,看我做过一点手脚的代码吧:
- #include <stdio.h>;
- #include <stdlib.h>;
- #include <string.h>;
- #include <ctype.h>;
- char *pcToLowerChar(char *pcBuf)
- {
- char *pcReturn;
-
- printf("before new pcReturn = %x\n", pcReturn);
- pcReturn = new char(strlen(pcBuf));
- printf("after new pcReturn = %x\n", pcReturn);
- memset(pcReturn, 0x00, strlen(pcBuf));
- printf("len=%d\n", strlen(pcBuf));
- for (int i = 0; i < strlen(pcBuf); i++)
- {
- *(pcReturn+i) = tolower(pcBuf[i]);
- }
- delete pcReturn;
- printf("after delete pcReturn = %x\n", pcReturn);
- return pcReturn;
- }
- int main(void)
- {
- char acT[20];
- char *p;
- printf("before init p = %x\n", p);
- strcpy(acT, "AAAAAAAAAAAA");
- p = pcToLowerChar(acT);
- printf("now p = %x\n", p);
- printf("acT = %s\n", p);
- }
复制代码
输出如下:
- before init p = 77e5ac21
- before new pcReturn = 610ed060
- after new pcReturn = a041078
- len=12
- after delete pcReturn = a041078
- now p = a041078
- acT =
复制代码
自己看看吧,因为new出来的内存不是在栈里而是在堆里,所以即使函数退出照样是可以访问的,但是可能是因为已经delete掉的原因所以printf是打印不出的.
或者你自己看看反汇编出来的代码自己理解看看,其实这个问题和:
- int f()
- {
- int n;
- n = 4;
- //.......
- return n;
- }
- 返回的是4
复制代码
是一样的道理,关键的是你要知道new出来的地址是在堆里,不会随着函数的结束的不能访问. |
|