【发布时间】:2020-08-13 07:12:35
【问题描述】:
假设您想在 C++ 中创建一个 realloc 函数。我想它可以像这样工作:
template<typename T>
void realloc(T** arr, int size, int original_size){
T *newArr = new T[size];
for(int i = 0; i<original_size;i++)
newArr[i] = (*arr)[i];
delete[] *arr;
*arr = newArr;
}
现在我的问题是在这里使用delete[] 是否正确?据我所知,分配的内存大小是在运行时跟踪的,所以 C++ 知道要删除多少。像这样传递它时会保留它还是有更好的方法来做到这一点?
【问题讨论】:
-
C++中没有垃圾收集器
-
该死的,出于某种原因,我认为有。我将编辑问题
-
代码看起来不错。当然,如果您使用
std::vector,您可以免费获得类似的东西(并且具有更好的实现)。 -
唯一可以接受使用
delete [] *arr的时间是如果*arr是由new []表达式产生的指针(或null,@987654327 @ 无效)。如果调用者传递了一个参数,使得*arr不是这样一个表达式的结果,那么行为是未定义的。此外,在您的代码中,如果original_size超过为*arr分配的实际大小或original_size > size,则循环的行为是未定义的(访问超过分配内存的末尾)。最后,您最好使用std::vector- 它负责干净地调整大小。 -
使用智能指针或容器会比手动处理内存省很多力。