又是指针问题,不明白???????
char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p; //返回指针p
}
void Test3(void)
{
char *str = NULL;
str = GetMemory3(100); //这里指针str也和指针p的指向一样的内存块。
strcpy(str, "hello ");
cout < < str < < endl;
free(str); //这里最终只是释放了str指向的内存块,对于str指针依然还是指向那块内存,看了一些资料说应该加一句str=0;那指针p呢?p也依然在指向那块内存啊。
}
[解决办法]
指针之间传递的就是地址,所以str和p所指向的内存块是同一个,释放其中任何一个即可
[解决办法]
那指针p呢?
=============================================================================
after returning from GetMemory()
p (局部变量)没了,那块内存还在。
现在str 指向那块内存。
看了一些资料说应该加一句str=0
=================================
也可以不写str=NULL,只要你不再引用str。
[解决办法]
同一块内存,释放一次即可,只不过所有指向那块内存的指针都失效了,就像楼主代码里的p和str
释放之后str就变成了野指针,加str=NULL,可以避免之后错误使用该指针,方便调试
[解决办法]
1.
函数进入Test3():
char* str = NULL;
======================
变量 变量的地址 变量的值(内容)
str 0x0013fe8c 0
2.
str = GetMemory3(..)=====>
char *p = (char *)malloc(sizeof(char) * num);
将分配的内存起始地址(0x003a60b0)赋给栈变量p,
===============================================
变量 变量的地址 变量的值(内容)
p 0x0013fda8 0x003a60b0
3. 从GetMemory3(..)返回, p的值(0x003a60b0)
拷贝给str, 栈变量p生命结束, 释放其所占栈内存
(地址0x0013fda8)
=================================================
变量 变量的地址 变量的值(内容)
str 0x0013fe8c 0x003a60b0
4. free(str): 释放str指向的内存(0x003a60b0开始的内存空间)
5. 推出Test3()后, 栈变量str生命结束, 释放其所占栈内存
(地址0x0013fe8c)
[解决办法]
呵呵 p没了
已经死了
:)
注意看变量的作用域
[解决办法]
char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p; //返回指针p
}
void Test3(void)
{
char *str = NULL;
str = GetMemory3(100); //调用完后p被析构,p为局部作用域存在于函数GetMemory3的栈中,当GetMemory3被调用完后,栈空间被释放,因而被析构。
strcpy(str, "hello ");
cout < < str < < endl;
free(str); //这里最好加一句str = NULL。
}
[解决办法]
注意p和它指向的对象的生命期是两回事
p是一个局部指针,而它指向的对象是堆空间具有全局生命期
[解决办法]
return p; //返回指针p
这里返回之后,p已经消失.
但是p指向的那块内存依然存在,并且被返回到了调用端,用str接收了.
所以只要free(str)就行了,也就释放了p申请的那块内存
然后把 str赋为NULL,是防止再错误的去使用它
又是指针有关问题,不明白?
又是指针问题,不明白???????char*GetMemory3(intnum){char*p(char*)malloc(sizeof(char)*num)returnp//
