尝试访问C中释放的内存时没有警告

时间:2014-02-22 06:55:35

标签: c memory-management malloc free

我正在尝试理解如何在C中管理内存。在下面的示例代码中,我在评论中添加了对内存管理方式的理解。

  1. 我想知道我是否正确
  2. 在代码的最后部分,我正在尝试访问已经释放的内存部分。我很惊讶为什么编译器没有通过任何警告
  3. struct node
    {
        int keys[2];
        int *pkeys;
    };
    
    int main()
    {
        int temp[2] = {10,20}; // creates a temp array in stack
        struct node* node = malloc(sizeof(struct node)); //allocates a block of memory on heap pointed by node
        node->keys[0]=1;node->keys[1]=2;  // assigns values for keys present in heap
        node->pkeys = malloc(2*sizeof(int)); // creates a pointer pkeys in heap
        node->pkeys = temp; // the pointer pkeys in heap points to the temp array in stack
        free(node); // the block of memory on heap pointed by node is freed
        node->keys[0] = 9; //**Why does the compiler ignore that I'm accessing freed memory?**
    }
    

3 个答案:

答案 0 :(得分:4)

C中的编译器不进行这种检查。如果有足够的绳索让自己挂起来。

由你来做检查。对于数组的边界检查也是如此。

此外,您需要注意malloc / free并不总是要求/提供给操作系统。这意味着它可能仍然可以被进程访问而没有seg错误。

答案 1 :(得分:2)

编译器不检查非法内存访问,并且您的程序将导致未定义的行为或甚至可能崩溃(分段错误)。行为是不可预测的,下次运行程序时,它可能会崩溃。

您的代码很少:

main的签名应该是int main(void)或者int main(int argc, char *argv[])

对此声明的评论是错误的。

node->pkeys = malloc(2*sizeof(int)); // creates a pointer pkeys in heap

您在分配内存并使pkeys指向它时创建了指针node。此语句为2 int的数组动态分配内存,并使pkeys指向它。因此,当您执行node->pkeys = temp时,您将失去对动态分配的数组的处理并导致内存泄漏。因此,在重新分配pkeys之前,您必须free它所指向的记忆。

free(node->pkeys);

// now reassign node->pkeys

答案 2 :(得分:0)

分配给node的空格已释放,但node仍指向同一位置。所以它仍然可以访问。但是如果你运气不好(那就是操作系统为了自己的目的而重复使用内存),你就会遇到分段错误。