【问题标题】:Dynamically allocated array not copying correctly动态分配的数组未正确复制
【发布时间】:2020-11-09 20:03:29
【问题描述】:

我有以下可重现的例子

#include <string>
#include <iostream>

using namespace std;

void printArray(int *data, int x)
{
    for(int v = 0; v < x; v++)
        cout << data[v] << endl;
}

void functionA(int &x_length, int &y_length, int *&x_array, int *&y_array);

int main()
{
    int x_length = 0;
    int y_length = 0;
    int * x_array = new int[x_length];
    int * y_array = new int[y_length];
    functionA(x_length, y_length, x_array, y_array);
    
    cout << "x length : " << x_length;
    cout << endl;
    cout << "y length : " << y_length;
    cout << endl;
    cout << "x array" << endl;
    printArray(x_array, x_length);
    
    cout << endl;
    cout << "y array" << endl;
    printArray(y_array, y_length);

    delete [] x_array;
    delete [] y_array;
}

void functionA(int &x_length, int &y_length, int *&x_array, int *&y_array)
{
    int x_length_functionA = 0;
    int y_length_functionA = 0;
    int x_increment = 0;
    int y_increment = 0;
    
    // Create array x
    for(int i = 3; i <= 8; i++)
    {
        ++x_length_functionA;
    }
    
    int * x_array_functionA = new int[x_length_functionA];
    
    for(int i = 3; i <= 8; i++)
    {
        x_array_functionA[x_increment++] = i;
    }
    
    x_length = x_length_functionA;
    x_array = x_array_functionA;
    
    // Create array y
    for(int i = 3; i <= 10; i++)
    {
        ++y_length_functionA;
    }
    
    int * y_array_functionA = new int[y_length_functionA];
    
    for(int i = 3; i <= 10; i++)
    {
        y_array_functionA[y_increment++] =i;
    }
    
    y_length = y_length_functionA;
    y_array = y_array_functionA;
    
    delete []x_array_functionA;
    delete []y_array_functionA;
    
}

输出结果(main() 中的 printArray)

x length : 6                                                                                                                                                                                  
y length : 8    
                                                                                                                                                                          
x array                                                                                                                                                                                       
0                                                                                                                                                                                             
0                                                                                                                                                                                             
5                                                                                                                                                                                             
6                                                                                                                                                                                             
7                                                                                                                                                                                             
8                                                                                                                                                                                             
                                                                                                                                                                                              
y array                                                                                                                                                                                       
0                                                                                                                                                                                             
0                                                                                                                                                                                             
5                                                                                                                                                                                             
6                                                                                                                                                                                             
7                                                                                                                                                                                             
8                                                                                                                                                                                             
9                                                                                                                                                                                             
10

预期的结果(main() 中的 printArray)

x length : 6                                                                                                                                                                                  
y length : 8    
                                                                                                                                                                          
x array                                                                                                                                                                                      
3                                                                                                                                                                                             
4                                                                                                                                                                                             
5                                                                                                                                                                                             
6                                                                                                                                                                                             
7                                                                                                                                                                                             
8                                                                                                                                                                                             
                                                                                                                                                                                              
y array                                                                                                                                                                                       
3                                                                                                                                                                                             
4                                                                                                                                                                                             
5                                                                                                                                                                                             
6                                                                                                                                                                                             
7                                                                                                                                                                                             
8                                                                                                                                                                                             
9                                                                                                                                                                                             
10

当我在functionA()printArray 时,数组打印了我想要的预期结果。当我在main 中将x_array_functionA 复制到x_arrayprintArray 时,输出结果不是我所期望的。前两个值始终为零。

为什么初始整数没有被复制?

注意:这是Getting rubbish value when cout my dynamic array 的后续行动。创建了一个新问题,因为我觉得如果没有适当的可重复示例,最初的问题就不清楚。也明白代码中可能存在内存泄漏。

【问题讨论】:

  • delete[]你的数组在functionA....的末尾
  • @ChrisMM 啊!现在我终于看到了。为functionA 中的new 释放内存的正确方法是什么?
  • 你的错误在这里 delete []x_array_functionA; delete []y_array_functionA; 请注意,在这些删除之前的 = 运算符 y_length = y_length_functionA; y_array = y_array_functionA; 只是将指针分配给指向相同的内存。
  • @churill 在实际程序中,x_arrayy_array是运行时用户输入的范围,因此没有固定的数组长度。
  • 使用std::vector 会简化代码。

标签: c++ arrays pointers memory memory-management


【解决方案1】:

这里:

delete [] x_array_functionA;
delete [] y_array_functionA;

你删除了数组。在此之后,阵列已被删除。访问它们是未定义的行为。删除它们两次(因为它们main 中被删除)绝对是未定义的行为。

请记住,您不会删除指针,而是删除分配的内容。一次使用名为x_array 的变量删除数组,一次使用名为x_array_functionA 的变量删除数组这一事实完全不相关——无论哪种方式,您都将同一个数组删除两次。

您的代码也永远不会删除在main 中分配的数组。

【讨论】:

    【解决方案2】:

    我不知道这就是所有的错误,但是在functionA的末尾,你有:

    delete []x_array_functionA;
    delete []y_array_functionA;
    

    在此之后使用的数组是UB。为了正确清理内存,当你这样做时

    x_array = x_array_functionA;
    

    你应该这样做

    delete[] x_array;
    x_array = x_array_functionA;
    

    y_array 也是如此。

    【讨论】:

    • 谢谢克里斯。为了确认我的理解,这意味着在复制x_array_functionA 之前,我需要先释放x_array 以避免内存泄漏。那么x_array_functionA 将复制到x_array 并分配一组新的内存?我应该在这个例子中的某个地方delete [] x_array_functionA 吗?
    • x_array = x_array_functionA 不会复制任何内容。它改变了x_array 指向的位置。在这一行之后,x_array 现在指向为x_array_functionA 分配的内存。因此,这意味着x_array_functionA 不应该delete[]ed。它由main 方法末尾的delete[] x_array; 处理。
    • 解释清楚,感谢帮助C++新手!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2012-05-21
    相关资源
    最近更新 更多