释放动态分配的内存时是否需要执行此额外步骤
Is this extra step necessary when freeing dynamically allocated memory
在动态分配数组的扩展过程中,我发现自己写了这个:
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;
}
但是,如果构造函数最初看起来像这样,则此行是必需的:
HPQueue::HPQueue::() {
capacity = INITIAL_CAPACITY;
array = new char*[static_cast<size_t>(logSize)];
for (int i = 0; i < logSize; i++) {
array[i] = new char;
}
count = 0;
}
注意:
/* instances variables */
char **array;
size_t count;
这LINE XX:
没有必要吗?
不,您不应该为array
的前count
元素调用new char
。您应该从prevArray
的前count
个元素复制。
您根本不需要打电话给new char
。如果改用nullptr
,则在删除元素时仍然可以安全地delete[] array[i]
。
但你不应该这样做。按优先顺序:
- 使用
std::vector<std::string> array
,它会为您完成所有这些工作。 - 使用
std::unique_ptr<std::unique_ptr<char[]>[]> array; std::size_t capacity;
,随array = std::make_unique<std::unique_ptr<char[]>[]>(capacity);
重新分配,随std::move(prevArray.get(), prevArray.get() + count, array.get());
移动 - 使用
char **array; std::size_t capacity;
,array = new char*[capacity];
重新分配,随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;
}
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在c++中使用动态分配的问题
- 使用递归模板动态分配的多维数组
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 访问动态分配列表中的元素
- 为什么 std::equal_to会导致动态分配?
- 调用析构函数以释放动态分配的内存
- 动态分配Q_Property变量
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 使用动态分配将 char* 复制到另一个字符**
- 释放动态分配的内存时是否需要执行此额外步骤
- 为什么在 C++ 执行删除操作后仍可以访问释放的动态分配的内存
- C++标准库中是否有保证不执行动态内存分配的函数或类
- c++:执行动态分配的新运算符检查内存安全性
- c++动态分配变量,执行的流程是什么
- 每次在std::list容器中插入元素时,都会执行动态分配