在自由指针存储器后,我可以重新赋值

时间:2014-02-27 09:32:58

标签: c debugging dbx

您好我正在学习一些调试概念。在这个程序中,我试图模拟核心转储。我预计核心会被抛弃但它不会产生核心。程序执行没有任何问题。

首先我为ptr分配20个字节。我将一个新字符串复制到ptr。然后我释放ptr然后打印ptr它没有任何pblm工作。最后我重新分配了一些其他的字符串,我希望这次它可能会产生核心转储。但我没有得到任何核心转储。任何人都可以解释为什么它不会产生核心转储。

int main()
{
   char *ptr;
   ptr =(char*)  malloc (20);
   strcpy(ptr,"MemoryOperations");
   printf("Before Free memory : %s\n",ptr);
   free(ptr);
   printf("After Free memory : %s\n",ptr);
   strcpy(ptr,"MemReassign");
   printf("After Re Assigning : %s\n",ptr);
   return 0;
}

使用dbx运行相同的代码,

(dbx) check -all
access checking - ON
memuse checking - ON
(dbx) run
Running: a.out 
(process id 19081)
RTC: Enabling Error Checking...
RTC: Running program...
Before Free memory : MemoryOperations
Read from unallocated (rua):
Attempting to read 1 byte at address 0x100101a48
which is 2232 bytes into the heap; no blocks allocated
stopped in _ndoprnt at 0xffffffff671abbf0
0xffffffff671abbf0: _ndoprnt+0x1c04:    call     _PROCEDURE_LINKAGE_TABLE_+0x620 [PLT] ! 0xffffffff67340d20
(dbx) exit

2 个答案:

答案 0 :(得分:3)

如果在释放后写入内存,则可能发生任何事情。这是未定义的行为。你可以得到核心转储。在您的情况下,您没有获得核心转储,因为您的进程仍然可以访问内存,即使它已被释放。如果您在malloc语句之前执行另一个return 0并写入该内存,则很可能会覆盖字符串“After Re Assigning ...”。

使用dbx时,printf("After Free memory : %s\n",ptr);语句会生成“从未分配读取”错误,因为您已启用访问检查,但没有dbx,根本就没有访问权限检查。

要模拟核心转储,您可以这样做:

void main()
{
  char *p = NULL ;
  *p = 'A' ;
}

这会在大多数平台上崩溃。

答案 1 :(得分:1)

free(ptr)不会修改ptr的值。它只标记相应的位置可用于重新分配。

A block of memory previously allocated by a call to malloc, calloc or realloc is
deallocated, making it available again for further allocations.
Notice that this function does not change the value of ptr itself, 
hence it still points to the same (now invalid) location.
--cplusplus.com

因此,如果你真的想要生成核心转储尝试一些肯定的镜头,然后尝试一些疯狂的事情,如:

char d=10/0;  //arithematic

char *a=malloc(1);
free(a);
a=NULL;   //this is important after free.
*a=100;