C++ 释放动态分配的内存时,是否需要此额外步骤
在动态分配阵列的扩展过程中,我发现自己在写以下内容:C++ 释放动态分配的内存时,是否需要此额外步骤,c++,arrays,C++,Arrays,在动态分配阵列的扩展过程中,我发现自己在写以下内容: void HPQueue::expandCapacity() { char **prevArray = array; capacity *= 2; array = new char*[static_cast<size_t>(capacity)]; for (int i = 0; i < capacity; i++) { array[i] = new char; } for (size_t i
void HPQueue::expandCapacity() {
char **prevArray = array;
capacity *= 2;
array = new char*[static_cast<size_t>(capacity)];
for (int i = 0; i < capacity; i++) {
array[i] = new char;
}
for (size_t i = 0; i < count; i++) {
array[i] = prevArray[i];
LINE XX: delete prevArray[i]; <----------- This line seems to be the problem, Since it also deletes array[i]
}
delete[] prevArray;
}
这是不是不必要的
第XX行:
不,您不应该为数组的第一个计数元素调用新字符。您应该从prevary
的第一个count
元素进行复制
您根本不需要调用newchar
。如果改用nullptr
,则在删除元素时仍然可以安全地删除[]数组[i]
但你不应该这么做。按优先顺序:
- 使用
std::vector array
,它可以为您完成所有这些
- 使用
std::unique_ptr数组;标准:尺寸和容量编码>并使用array=std::使_唯一(容量)重新分配代码>并使用std::move移动(prevArray.get(),prevArray.get()+count,array.get())代码>
- 使用
char**数组;标准:尺寸和容量代码>,使用数组=新字符*[容量]重新分配编码>并使用std::copy\n移动(prevArray,count,array)代码>
因此,如果您被要求使用最后一个,您将获得
HPQueue::HPQueue()
: capacity(INITIAL_CAPACITY),
array(new char*[INITIAL_CAPACITY]),
count(0)
{
std::fill_n(array, capacity, nullptr);
}
void HPQueue::expandCapacity() {
char **prevArray = array;
capacity *= 2;
array = new char*[capacity];
auto pos = std::copy_n(prevArray, count, array);
std::fill_n(pos, capacity - count, nullptr);
delete[] prevArray;
}
在您的示例中,需要行XX:
,因为这行数组[i]=newchar代码>。new
分配的每个数据都必须通过delete
或delete[]
@Raffallo来释放,这是我的理解,但这样做似乎会破坏array[i]
任何你试图重新发明轮子的特定原因,又称
,并且不使用
提供的智能指针来执行此操作?为什么要动态分配单个char
s?此外,容量*=2;数组=新字符*[static_cast(容量)]
--如果new[]
抛出异常,则容量
成员现在由于被更改而出错。我这样做的原因是,因为出于某种原因,您动态分配每个字符
是为了允许使用strings@base10:这将不会使它与字符串一起工作。字符串必须连续存储,调用new char
N次不会给您连续的分配,它会给您分散在各地的单个字符。而您的循环调用new char
是没有用的,因为您会立即覆盖下一个循环中的指针,从而泄漏分配。@BenVoigt现在我明白了为什么他会对此感到困惑,谢谢您的提醒me@base10如果您曾经分配数组[i]=new char[]
,然后您需要跟踪哪个i
有new char
,哪个有new char[]
调用delete
或delete[]
。不这样更容易。
/* instances variables */
char **array;
size_t count;
HPQueue::HPQueue()
: capacity(INITIAL_CAPACITY),
array(new char*[INITIAL_CAPACITY]),
count(0)
{
std::fill_n(array, capacity, nullptr);
}
void HPQueue::expandCapacity() {
char **prevArray = array;
capacity *= 2;
array = new char*[capacity];
auto pos = std::copy_n(prevArray, count, array);
std::fill_n(pos, capacity - count, nullptr);
delete[] prevArray;
}