【问题标题】:Checking if char out of not fully filled array is empty检查未完全填充的数组中的字符是否为空
【发布时间】:2014-10-13 05:14:59
【问题描述】:

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

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

char* someNewArray = new char[someInt];

//Add values to the array

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

【问题讨论】:

  • 你的“空”是什么意思?您希望用户如何在元素之间的usr_answer 中输入“空”字符?
  • 一个未初始化的数组可以包含任何东西。如果您希望它具有某些值,您可以检查然后将每个元素设置为该值。你最好使用std::string
  • @P0W 基本上我的计划是得到他的答案,得到给定答案中的字符数量(不指向任何内容),然后创建一个新的调整大小的字符数组。他不必输入空元素。只需输入一个字符集合,其字符数少于数组所能容纳的字符数。
  • @RetiredNinja 我调用 cin 时它不会自动“包含”值吗?不是只有空的元素吗?我想知道如何检查这些是否为 NULL。
  • 它包含输入的内容,直到第一个空白字符、NULL,然后是未初始化数组中发生的任何其他内容。您显示的代码中的问题是您执行的比较不正确。 if(c == 0) 会起作用,但我不会说这是正确的做法。如果输入 1001 个字符会怎样?使用std::string 可以避免所有这些问题,因为它会调整大小以适应内容,您可以轻松确定该大小。如果必须使用原始字符数组,请使用 strlen 查找输入的长度。

标签: c++ pointers memory dynamic delete-operator


【解决方案1】:

不,你不能。

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

如果你想一个一个地释放块,你必须以相同的粒度来分配它们,也就是一个一个地。

编辑:

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

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;

【讨论】:

  • 如果你能提供一个例子就太好了。
  • :) 提前谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2022-12-08
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
相关资源
最近更新 更多