使用指向数组中元素的指针释放内存

时间:2014-08-14 02:12:27

标签: c++ pointers memory-management

我有以下C ++代码:

int main(){
    unsigned char *abc = (unsigned char *)calloc(100,1);
    unsigned char *def = &abc[50];
    delete def;
}

这会释放调用calloc所分配的所有内存,还是从def指向的内存位置开始的内存释放?

4 个答案:

答案 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取消分配,而不是其中的一部分。

请参阅http://www.cplusplus.com/reference/cstdlib/calloc/

答案 1 :(得分:3)

delete只能删除使用new分配的内存。

分配给calloc的内存使用free解除分配。

并且不,你不能只使用指向里面分配内存的指针。


在C ++中,使用std::string标题中的<string>来处理简单的字符串。

它会为您处理内存管理。

答案 2 :(得分:1)

由于它具有未定义的行为,因此不必解除分配任何内容。您只能在分配了delete的指针上调用new。不仅内存分配了calloc而不是new,而且您也没有传递指向calloc返回的指针,而是指向该内存块中的其他位置。

答案 3 :(得分:0)

Isn&#t; t * abc在那里未定义?删除def;如果没有什么可以删除的话就不会做任何事情!