大家好请花一些时间@查看下面的代码段:
#include <iostream>
#include <stdlib.h>
using namespace std;
int func2(void* ptr1)
{
cout << " IN Func2" << endl;
if(ptr1)
{
//i freed this Pointer.
free(ptr1);
ptr1 = NULL;
cout << "PTR MADE NULL" << endl;
return 1;
}
}
int func(void** ptr1)
{
cout << " IN Func" << endl;
int *ptr2 = (int*)malloc(10*sizeof(int));
if(ptr1)
{
*ptr1 = ptr2;
cout << " NOT NULL" << endl;
return 1;
}
else
{
cout << " NULL " << endl;
return 0;
}
}
int main()
{
int res = 0;
void *ptr = NULL;
func((void**)&ptr);
res = func2((void*)ptr);
if(res)
{
//Expecting this to be updated with NULL.. surely not working
if(ptr)
{
//why I'm Coming here
cout << "Freeing Ptr for 2nd time " << endl;
free(ptr);
}
}
cin.get();
return 0;
}
请帮助我理解上面的代码行为。 我对“为什么ptr指针没有被赋值为NULL值&amp;它用于第二次释放内存”这一部分更感兴趣
我的观察:
第一个问题:如果要制作内容@ location 0x28ff40 = NULL,我应该修改什么 第二个问题:我搞砸了类型转换,我不明白我是如何错过基地址的:0x28ff40
请帮助我理解这一点。
注意:请忽略返回值验证。请忽略C / C ++风格的混合使用情况。不建议更改函数参数。
提前感谢人们!!!
答案 0 :(得分:1)
您需要将ptr
的地址传递给经过调整的func2()
。
修改func2()
以像func()
:
int func2(void** ptr1)
{
cout << " IN Func2" << endl;
if(*ptr1)
...
然后这样称呼它:
res = func2((void**)&ptr);