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

标签 c++

假设我想调整一个 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/

相关文章:

c++ - 从 C/C++ 程序使 LED 闪烁的步骤?

用于创建类实例的 C++ 语法

C++ 模板,链接错误

c++ - 错误 LNK2019 : unresolved external symbol

c++ - 在不同的函数中使用相同的参数

c++ - 如何避免此代码中的堆栈溢出,(递归函数)

c++ - 这个 C++ 引用初始化合法吗?

javascript - node.js 在 Web 开发环境中的位置在哪里?

c++ - std::bind 和可变参数模板函数

c++ - 如何使用 OpenCV 从图像中去除径向失真?