尝试访问C中释放的内存时没有警告
我试图理解如何在C中管理内存。在下面的示例代码中,在注释中,我添加了我对如何管理内存的理解尝试访问C中释放的内存时没有警告,c,memory-management,malloc,free,C,Memory Management,Malloc,Free,我试图理解如何在C中管理内存。在下面的示例代码中,在注释中,我添加了我对如何管理内存的理解 我想知道我是否正确 在代码的最后一部分,我试图访问已经释放的内存的一部分。我很惊讶为什么编译器没有通过任何警告 C语言中的编译器不进行这种检查。如果你有足够的绳子吊死自己 由你来做检查。对于数组的边界检查也是如此 您还需要注意,malloc/free并不总是需要向操作系统乞讨/给予。这意味着进程仍然可以访问它,而不会出现seg错误。C中的编译器不会进行这种检查。如果你有足够的绳子吊死自己 由你来做检查。对
C语言中的编译器不进行这种检查。如果你有足够的绳子吊死自己 由你来做检查。对于数组的边界检查也是如此
您还需要注意,malloc/free并不总是需要向操作系统乞讨/给予。这意味着进程仍然可以访问它,而不会出现seg错误。C中的编译器不会进行这种检查。如果你有足够的绳子吊死自己 由你来做检查。对于数组的边界检查也是如此
您还需要注意,malloc/free并不总是需要向操作系统乞讨/给予。这意味着进程仍然可以在没有seg故障的情况下访问它。分配给
节点的空间被释放,但节点仍然指向相同的位置。因此,它仍然是可访问的。但是如果您运气不好(即操作系统将内存重新用于自己的目的),您将遇到分段错误。分配给节点的空间被释放,但节点仍然指向相同的位置。因此,它仍然是可访问的。但是如果您运气不好(即操作系统将内存重新用于自己的目的),您将遇到分段错误。编译器不会检查非法内存访问,您的程序将导致未定义的行为,甚至可能崩溃(分段错误)。这种行为是不可预测的,下次运行程序时,它可能会崩溃
关于代码的几点:
main
的签名应为int main(void)
或
int main(int argc,char*argv[])
对这一说法的评论是错误的
node->pkeys = malloc(2*sizeof(int)); // creates a pointer pkeys in heap
分配内存时,您创建了指针pkeys
,并使节点指向它。此语句为2个int
s数组动态分配内存,并使pkeys
指向它。因此,在执行节点->pkeys=temp
操作时,会丢失动态分配数组的句柄,并会导致内存泄漏。因此,在重新分配pkeys
之前,必须释放它指向的内存
free(node->pkeys);
// now reassign node->pkeys
编译器不会检查非法内存访问,您的程序将导致未定义的行为,甚至可能崩溃(分段错误)。这种行为是不可预测的,下次运行程序时,它可能会崩溃
关于代码的几点:
main
的签名应为int main(void)
或
int main(int argc,char*argv[])
对这一说法的评论是错误的
node->pkeys = malloc(2*sizeof(int)); // creates a pointer pkeys in heap
分配内存时,您创建了指针pkeys
,并使节点指向它。此语句为2个int
s数组动态分配内存,并使pkeys
指向它。因此,在执行节点->pkeys=temp
操作时,会丢失动态分配数组的句柄,并会导致内存泄漏。因此,在重新分配pkeys
之前,必须释放它指向的内存
free(node->pkeys);
// now reassign node->pkeys
编译器不会检查这样的错误。就此而言,如果您忘记了一个“;”,为什么它不能只放一个;这里不是给您一个错误:编译器没有检查pMemory访问。因此,编译时不会看到错误。这段代码在你运行时会失败。C:汇编语言的所有功能和所有安全的。。。汇编语言。@arunmoezhi,因为释放已释放的内存是一个错误。写入释放的内存是未定义的行为。编译器不会检查此类错误。就此而言,如果您忘记了一个“;”,为什么它不能只放一个“;”;这里不是给您一个错误:编译器没有检查pMemory访问。因此,编译时不会看到错误。这段代码在你运行时会失败。C:汇编语言的所有功能和所有安全的。。。汇编语言。@arunmoezhi,因为释放已释放的内存是一个错误。写入释放的内存是未定义的行为。您是对的node->pkeys=temp
将丢失2个整数数组的句柄。我是故意那样做的。我应该修改那一行中的注释,因为//在heap中创建了一个数组,并使pkey(也存在于heap中)指向它
等一会儿。为什么我必须显式地执行free(node->pkeys)
?当我执行free(node)
操作时,它不会释放节点内完成的所有malloc吗?@arunmoezhi否,因为首先为node
分配内存,然后通过单独的malloc
调用为node->pkeys
分配内存。通过单独的malloc
调用分配的内存需要单独的free
d。您是对的node->pkeys=temp
将丢失2个整数数组的句柄。我是故意那样做的。我应该修改那一行中的注释,因为//在heap中创建了一个数组,并使pkey(也存在于heap中)指向它
等一会儿。为什么我必须显式地执行free(node->pkeys)
?当我执行free(node)
操作时,它不会释放节点内完成的所有malloc吗?@arunmoezhi否,因为首先为node
分配内存,然后通过单独的malloc
调用为node->pkeys
分配内存。通过单独的malloc
调用分配的内存需要单独的free
d;你至少知道你做错了什么。如果您没有seg故障,但确实损坏了一些合法用于其他目的的数据,那么您就是不幸运的