提问者:小点点

未正确复制动态分配的数组


我有以下可复制的示例

#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时,数组打印了我想要的预期结果。 当我将x_array_functionA复制到x_arrayprintarray中时,输出结果不是我所期望的。 前两个值始终为零。

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

注意:这是在cout我的动态数组时获取垃圾值的后续操作。 创建了一个新的问题,因为我觉得最初的问题没有一个适当的可复制的例子是不清楚的。 还要理解代码中很可能存在内存泄漏。


共2个答案

匿名用户

我不知道这就是所有的错误,但是在函数a的末尾,您有:

delete []x_array_functionA;
delete []y_array_functionA;

之后数组的使用是ub。 为了正确地清理内存,当您这样做时

x_array = x_array_functionA;

你应该

delete[] x_array;
x_array = x_array_functionA;

对于y_array也是如此。

匿名用户

此处:

delete [] x_array_functionA;
delete [] y_array_functionA;

删除数组。 在这一点之后,数组已被删除。 访问它们是未定义的行为。 删除它们两次(因为它们也在main中被删除)肯定是未定义的行为。

记住你不是删除指针,你是删除你分配的东西。 一次使用名为X_array的变量删除数组,一次使用名为X_array_functionA的变量删除数组,这两个事实完全无关--无论哪种方式,都要删除同一个数组两次。

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