c++ - 从一个动态分配的数组复制到另一个 C++

标签 c++ memory dynamic-arrays

这似乎应该有一个 super 简单的解决方案,但我就是想不通。我只是创建一个调整大小的数组并尝试复制所有原始值,然后最后删除旧数组以释放内存。

void ResizeArray(int *orig, int size) {
    int *resized = new int[size * 2]; 
    for (int i = 0; i < size; i ++)
        resized[i] = orig[i];
    delete [] orig;
    orig = resized;
}

这里似乎发生的是 resized[i] = orig[i] 是通过引用而不是值来复制值,因为在调整大小后打印 orig 会返回一堆垃圾值,除非我注释掉delete [] orig。我怎样才能从 orig 到 resized 的深拷贝,或者我还面临其他一些问题吗?我不想使用 std::vector。

最佳答案

请记住,C++ 中的参数是按值传递的。您将 resized 分配给传递给您的指针的 copy,函数外部的指针保持不变。

您应该使用双间接(或“双指针”,即指向 int 的指针的指针):

void ResizeArray(int **orig, int size) {
    int *resized = new int[size * 2]; 
    for (int i = 0; i < size; i ++)
        resized[i] = (*orig)[i];
    delete [] *orig;
    *orig = resized;
}

或对指针的引用:

void ResizeArray(int *&orig, int size) {
    int *resized = new int[size * 2]; 
    for (int i = 0; i < size; i ++)
        resized[i] = orig[i];
    delete [] orig;
    orig = resized;
}

顺便说一下,对于数组大小,您应该使用 中的类型 std::size_t - 它可以保证保持任何对象的大小并使得很清楚我们正在处理对象的大小。

关于c++ - 从一个动态分配的数组复制到另一个 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8056746/

相关文章:

c++ - 如何在 Windows 和 Linux 之间移植的 visual studio C++ 中进行串口编程?

algorithm - 使用动态数组处理哈希表中的冲突

c++ - codeblocks - 使用大地址感知标志编译

C++ - 重载运算符 >> 并使用 C 风格字符串处理输入

Excel VBA - 如何添加动态数组公式

c++ - 如何处理非法地址删除

c++ - 用 C++ 编写状态机

c++ - 使用 std::filesystem 替换文件

java - 使用Jedis的Redis中单个键占用的内存?

c - 静态存储在内存中的全局变量在哪里?