假设我想调整一个 int 指针数组的大小,我有一个看起来像这样的函数
template<typename T>
static void Resize(T* arr, UINT oldsize, UINT newsize) {
T* ret = new T [newsize];
memcpy(ret, arr, sizeof(arr[0]) * oldsize);
delete[] arr;
arr = ret;
};
当我尝试调整使用“new”关键字创建的元素数组的大小时(即使类中的数据本身是 POD),问题就开始了,因为 delete[] 触发了它们的析构函数,然后离开了新数组带有指向不再存在的对象的指针。所以..即使对象是用“new”创建的,我不能只使用 free 命令来摆脱旧数组吗?或者以某种方式删除数组而不触发每个成员的析构函数?
最佳答案
使用 std::vector
。
编辑:应大众需求,解释为什么 OP 的代码不起作用。
代码:
template<typename T>
static void Resize(T* arr, UINT oldsize, UINT newsize) {
T* ret = new T [newsize];
memcpy(ret, arr, sizeof(arr[0]) * oldsize);
delete[] arr;
arr = ret;
};
这里的arr
是一个按值传递的指针。在最后分配给 arr
只会更新实际参数的本地拷贝。因此,在此之后,调用代码中的实际参数指向一个已被delete
d 的数组,结果非常灾难性!
可以通过通过引用传递该指针来挽救它:
template<typename T>
static void Resize(T*& arr, UINT oldsize, UINT newsize) {
T* ret = new T [newsize];
memcpy(ret, arr, sizeof(arr[0]) * oldsize);
delete[] arr;
arr = ret;
};
但这仍然是非常脆弱的代码。
例如,调用者需要跟踪数组大小。
使用名为 a
的 std::vector
,调整大小调用将看起来像
a.resize( newSize )
并且与 DIY 解决方案相反,当 newSize
较大时, vector 的那些额外元素将被清零(这比将它们保留为不确定值要安全一些)。
std::vector
可以像原始数组一样被索引。有关如何使用它的更多详细信息,请参阅您的 C++ 教科书。如果您还没有 C++ 教科书,那就买一本吧:对于大多数人来说,从网上的文章和问答中学习 C++ 只是一个不切实际的提议。
关于c++ - 我需要调整指针数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13616163/