使用指向数组中元素的指针释放内存 我有以下C++代码: int main(){ unsigned char *abc = (unsigned char *)calloc(100,1); unsigned char *def = &abc[50]; delete def; }

使用指向数组中元素的指针释放内存 我有以下C++代码: int main(){ unsigned char *abc = (unsigned char *)calloc(100,1); unsigned char *def = &abc[50]; delete def; },c++,pointers,memory-management,C++,Pointers,Memory Management,这是释放调用calloc分配的所有内存,还是仅从def指向的内存位置开始释放内存?这是未定义的行为。如果你幸运的话,一次撞车 根据C++标准工作草案,N329 1= 11-066 3.7.4.2解除分配函数[基本.stc.动态.解除分配] 价值 提供给释放函数的第一个参数可以是空指针值;如果是,如果取消分配 函数是标准库中提供的函数,调用无效。否则,行为是未定义的 如果标准库中提供给运算符deletevoid*的值不是返回的值之一 通过先前调用标准库中的运算符newstd::size\u t或

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

这是未定义的行为。如果你幸运的话,一次撞车

根据C++标准工作草案,N329 1= 11-066

3.7.4.2解除分配函数[基本.stc.动态.解除分配]

价值 提供给释放函数的第一个参数可以是空指针值;如果是,如果取消分配 函数是标准库中提供的函数,调用无效。否则,行为是未定义的 如果标准库中提供给运算符deletevoid*的值不是返回的值之一 通过先前调用标准库中的运算符newstd::size\u t或运算符newstd::size\u t,constvstd::nothrow\u t&来

这里有几个问题。首先,如果使用calloc,那么应该使用free

然后,您应该传递以释放从calloc获得的相同指针

calloc将内存分配为一个连续的块,整个块将释放空闲内存,而不是其中的一部分


请参阅。

它不一定会释放任何东西,因为它有未定义的行为。只能对分配了new的指针调用delete。不仅是使用calloc而不是new分配的内存,而且您也没有传递指向calloc返回的内容的指针,而是传递到该内存块中的其他位置。

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

对于使用calloc分配的内存,请使用free释放它

不,你不能只使用一个指针指向分配内存中的某个地方

C++中,通过从标题中使用STD::string来处理简单字符串。


它为您管理内存。

这里不是没有定义*abc吗?删除def;如果没有要删除的内容,我不会做任何事情

什么是未签名字符*def=&abc[50];就是说,def指针仅引用位置abc[50]处的指针*abc指向的位置。def应该指向该位置的元素,但此时该元素为空。