c++ - 检查未完全填充的数组中的字符是否为空

标签 c++ pointers memory dynamic delete-operator

你可能知道,如果你想删除任何类型的动态分配数组(你使用运算符new[]),你应该使用delete[] 摆脱它。

现在,我想知道是否有任何方法可以删除动态分配数组的单个对象。

char* someNewArray = new char[someInt];

//Add values to the array

delete &someNewArray[2] //or maybe delete[] instead of just delete

最佳答案

不,你不能。

new 运算符以其数组形式分配一个内存元素,该元素能够包含您要求的元素数量。您只能使用 delete[] 释放整个 block 。

如果你想一个一个地释放 block ,你必须以相同的粒度分配它们,即一个一个地分配。

编辑:

对于大小为 1 的对象没有什么意义,因为分配 block 的重载面对 sizeof(char) 时会很大。在这种情况下,分配一个大小为 someInt -1 的新 block 更有效,使用 memcpy 然后使用 delete[] 释放初始 block

char * tmp = new char[someInt -1];
memcpy(tmp, someNewArray, 2);
memcpy(tmp+2, someNewArray + 3, someInt - 3);
delete[] someNewArray;
someNewArray = tmp;

但是如果你添加一个更大的对象数组,比如LObj,而不是

LObj * newArray = new LObj[someInt];

你可以使用:

LObj ** newArray = new (LObj *)[someInt];
for (i=0; i<someInt; i++) {
    newArray[i] = new LObj;
}

那么使用是有意义的:

delete newArray[2];
newArray[2] = NULL;

关于c++ - 检查未完全填充的数组中的字符是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26333286/

相关文章:

c++ - 使用CMake而不是g++链接GDAL库

C++ 回调数组

c - 字符串的名称是 char 指针吗?

c - malloc 有什么问题吗?

php - php内存中数组的大小

c++ - Visual Studio 中Linux as/MTd 对应的库是什么?

c++ - 有时无法从/proc/self/maps 获取堆栈范围

c - 你如何在 C 中将 void 指针转换为 char 指针

memory - 将相同的物理地址映射到不同的虚拟地址空间

c++ - 取消引用 NULL 指针是否保证使 C/C++ 中的程序崩溃?