我是 C 新手。我已经看到在许多示例中 malloc() 总是与 free() 配对。但是如果我这样做:比如 *p = "a string" ,我可以释放指针 p 吗?它会导致内存泄漏问题吗?
编辑:感谢所有回复!所以我的问题变成了:如果我在函数中有 *p = "a string",这是否意味着当函数结束时编译器将自动“释放”用于该函数调用的所有内存,所以我不必须手动管理任何东西来处理内存?
我是 C 新手。我已经看到在许多示例中 malloc() 总是与 free() 配对。但是如果我这样做:比如 *p = "a string" ,我可以释放指针 p 吗?它会导致内存泄漏问题吗?
编辑:感谢所有回复!所以我的问题变成了:如果我在函数中有 *p = "a string",这是否意味着当函数结束时编译器将自动“释放”用于该函数调用的所有内存,所以我不必须手动管理任何东西来处理内存?
不,你不能释放它,你也不应该释放它。
当您使指针指向例如字符串文字时,它指向不是您分配的内存。您应该只释放您明确分配的内存(例如malloc
,calloc
或strdup
)。
其他函数也可能会分配您需要释放的内存,但是他们应该在他们的文档中说明这一点。
作为一般经验法则:如果您明确分配一些资源(如内存或文件),那么您也应该释放它。
当你这样做时*p = "a string"
,你有一个指向p
字符串文字的指针。在这种情况下,不会动态分配内存。所以,没有必要释放p
,你也不应该。
不,“字符串”是存储在只读静态内存中的数据,而 p 是指向它的指针。您只能释放指向使用 malloc 分配的内存的指针。
你不需要释放这个指针,因为它指向一个字符串常量。如果您尝试释放它,它实际上可能会导致未定义的行为。
内存管理的基本规则:如果你调用malloc()
了内存,你应该free()
在不需要的时候释放它。
对于初学者,您应该编写const char *p = "a string";
,因为修改字符串文字是未定义的行为p[0] = 'A';
(例如,使用类似的语句)。放弃const
会使你陷入困境。
并且你不能试图删除指针内存;这也是未定义的行为。
黄金法则:总是成对malloc
的。free
请放心,在您的情况下,您的字符串文字占用的内存将在程序退出时由 C 运行时优雅地释放回操作系统。