我有以下C ++代码:
int main(){
unsigned char *abc = (unsigned char *)calloc(100,1);
unsigned char *def = &abc[50];
delete def;
}
这会释放调用calloc所分配的所有内存,还是从def
指向的内存位置开始的内存释放?
答案 0 :(得分:4)
这是未定义的行为。如果你幸运的话会崩溃。
根据C ++标准(工作草案,N3291 = 11-0061)
3.7.4.2解除分配函数[basic.stc.dynamic.deallocation]
...
的价值 提供给释放函数的第一个参数可以是空指针值;如果是的话,如果解除分配 函数是标准库中提供的函数,调用无效。否则,行为未定义 如果提供给标准库中的运算符
delete(void*)
的值不是返回的值之一 通过先前在标准库中调用运算符new(std::size_t)
或运算符new(std::size_t, constvstd::nothrow_t&)
...
这里有几个问题。首先,如果您使用free
,则应使用calloc
。
然后,您应该从free
传递calloc
相同的指针。
calloc
将内存分配为一个连续的块,整个块将被free
取消分配,而不是其中的一部分。
答案 1 :(得分:3)
delete
只能删除使用new
分配的内存。
分配给calloc
的内存使用free
解除分配。
并且不,你不能只使用指向里面分配内存的指针。
在C ++中,使用std::string
标题中的<string>
来处理简单的字符串。
它会为您处理内存管理。
答案 2 :(得分:1)
由于它具有未定义的行为,因此不必解除分配任何内容。您只能在分配了delete
的指针上调用new
。不仅内存分配了calloc
而不是new
,而且您也没有传递指向calloc
返回的指针,而是指向该内存块中的其他位置。
答案 3 :(得分:0)
Isn&#t; t * abc在那里未定义?删除def;如果没有什么可以删除的话就不会做任何事情!