【发布时间】:2011-06-10 22:51:32
【问题描述】:
我使用 fork() 创建了一个父进程和一个子进程,它们共享一个名为“ptr”的内存地址。但是由于程序的一个输出,我感到困惑:
1) ptr 的地址:123456 注意:父母和孩子的地址相同,所以如果一个进程改变了这个地址,它也应该反映到另一个进程,因为地址是相同的。
2) 父级:*ptr=44
3) 孩子:*ptr=33
4) 打印值: 父级仍然保留旧值: printf("ptr = %d",*ptr); // 输出:仍然是 44,exp 是 33 Child 打印 33,即预期值。 printf("ptr = %d",*ptr);//打印33个罚款
问题1) 谁能告诉我,价值观有何不同?虽然父子的指针地址是一样的?
Question2) 我正在开发一个内存泄漏工具,它提供双重释放,错误,因为它看到父级和子级释放相同的地址。但是,正如我们所见,这不是双重免费的情况。如何排序这个问题?由于该工具看到的父母和孩子的内存地址是相同的地址吗?
P.S: 请看下面的代码 sn-p:
#include <sys/types.h>
#include <unistd.h>
#include <cstdlib>
int main()
{
int pid, *ptr
ptr=(int*)malloc(sizeof(int));
*ptr=33; // Parent keeps the data as 33, before forking.
if(pid==0){*ptr=44;} // Child modifies data, which is ignored by parent
// Now we print the memory address and the value both by child and parent
if(pid==0)
{
printf("Child data: %u\n",*ptr);
printf("Child address: %u\n",ptr);
}
if(pid>0)
{
printf("Parent data: %u\n",*ptr);
printf("Parent address: %u\n",ptr);
}
}
输出: 儿童数据:44 孩子地址:123456
父数据:33(怎么还是旧值?) 父地址:123456(为什么地址相同但数据与子不同?)
【问题讨论】:
-
父子在
fork()之后是独立的,意味着他们不能看到彼此的数据。如果您希望他们共享所有数据,请考虑改用线程。 -
关于您的问题 2:该工具如何查看两个免费的?如果它在进程上下文中运行,它只能看到一个。只要再次调用了一个malloc,同一地址上的多个免费都是有效的!所以只看地址不会让你走得太远......