在函数中初始化并且未在main中初始化

时间:2012-08-30 14:59:53

标签: c++ arrays malloc main scoping

我正在尝试在函数中分配内存,但我不确定我做错了什么。 我想要这个:

int main()
{
    int* test= 0;
    initialize(test, 10);
    int test2 = test[2];
    delete[] test;
}

void initialize(int* test, int count)
{
    test = new int[count];
    for (int i = 0; i < count; i++)
    {
        test[i] = i;
    }
}

但是我收到此错误:Robust Simulation.exe中0x770d15de处的未处理异常:0xC0000005:访问冲突读取位置0x00000008。 它在线上断:int test2 = test [2];

但这有效:

int main()
{
    int* test=0;
    test = new int[10];
    for (int i = 0; i < 10; i++)
    {
        test[i] = i;
    }

    int test2 = test[2];
    delete[] test;
}

是否存在范围问题?我想,因为我传给它一个指针,它将被分配,我将能够在初始化函数之外访问它。

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

指针也按值传递。你需要:

void initialize(int*& test, int count)

您的版本不会更改原始指针:

void initialize(int* test, int count)
{
    //test is a copy of the pointer because it was passed by value
    //...
}

在此之后,显而易见delete[]失败的原因 - 因为main中的原始指针永远不会被初始化。

答案 1 :(得分:2)

进行以下更改: -

initialize(&test, 10);
....


void initialize(int** test, int count) 
{
     *test = new int[count];
     for (int i = 0; i < count; i++)
     {         (*test)[i] = i;     }
 }

如果你想要的话,C ++还有另一个叫做引用的功能: -

void initialize(int*& test, int count)
{
         test = new int[count];
         for (int i = 0; i < count; i++)
         {         test[i] = i;     }
}

你正在做的是传递测试[从main](地址将通过)并存储在另一个名为test的本地指针变量中。这个新变量具有生命周期的功能范围,很快就会被删除,在完成功能后留下垃圾

另一种选择是

int* test= initialize(test, 10);

并将初始化更改为

int* initialize(int* test, int count)
    {
             test = new int[count];
             for (int i = 0; i < count; i++)
             {         test[i] = i;     }
           return test;
    }

答案 2 :(得分:1)

您需要将指针传递给initialise函数。将原型更改为

void initialize(int* &test, int count) 

new的返回值分配给传递值时创建的指针的副本。因此,当函数退出时,该地址会因副本超出范围而丢失,因此您会发生内存泄漏。因此,您的test指针实际上从未指向任何已分配的内存,因此删除它会导致访问冲突。

通过引用传递允许test指针被函数

修改