gpt4 book ai didi

c++ - 我需要调整指针数组的大小

转载 作者:太空宇宙 更新时间:2023-11-04 15:23:44 26 4
gpt4 key购买 nike

假设我想调整一个 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 只会更新实际参数的本地拷贝。因此,在此之后,调用代码中的实际参数指向一个已被deleted 的数组,结果非常灾难性!

可以通过通过引用传递该指针来挽救它:

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;
};

但这仍然是非常脆弱的代码。

例如,调用者需要跟踪数组大小。

使用名为 astd::vector,调整大小调用将看起来像

a.resize( newSize )

并且与 DIY 解决方案相反,当 newSize 较大时, vector 的那些额外元素将被清零(这比将它们保留为不确定值要安全一些)。

std::vector 可以像原始数组一样被索引。有关如何使用它的更多详细信息,请参阅您的 C++ 教科书。如果您还没有 C++ 教科书,那就买一本吧:对于大多数人来说,从网上的文章和问答中学习 C++ 只是一个不切实际的提议。

关于c++ - 我需要调整指针数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13616163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com