据我了解,delete[]
用于释放new
分配的内存空间。 free()
也可用于释放该内存空间。那么在使用free()
代替delete[]
释放内存时,我将面临哪些类型的问题?
答案 0 :(得分:5)
“
free()
也可用于释放该内存空间。”
不,free()
不能用于释放使用new()
或new[]
分配的内存。
“当使用
free()
代替delete[]
释放内存时,我将面临哪些类型的问题?”
使用free()
代替delete[]
分配给new[]
的内存是未定义的行为(除了不会调用复杂对象的析构函数),以及这可能最终会导致运行时异常。
来自POSIX compliant reference(强调我的):
free()
函数将导致ptr指向的空间被释放;也就是说,可供进一步分配。如果ptr是空指针,则不会发生任何操作。否则,如果参数与先前由calloc()
,malloc()
,posix_memalign()
,realloc()
或strdup()
函数返回的指针不匹配,或者已通过调用free()或realloc()
取消分配,行为未定义。任何使用引用释放空间的指针都会导致未定义的行为。
好吧,new[]
或new()
的某些实现可能依赖于malloc()
函数系列,其他实现可能不依赖。因此,您无法确定分配的内存指针是否可以安全地使用(即使您不关心析构函数调用问题)。
结论:
delete[]
的用法仅定义为对使用new[]
分配的内存进行操作,delete
对应new
的结果。
同样,free()
的使用只能与使用malloc()
函数系列分配的内存一起很好地定义。
至于应用于您(原始)问题的c标记,因为c不支持delete
或new
要求这个c语言是没用的子>