2

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

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;
}

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

谢谢你的帮助

4

3 回答 3

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从未被初始化。

于 2012-08-30T15:00:44.417 回答
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;
    }
于 2012-08-30T15:05:24.067 回答
1

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

void initialize(int* &test, int count) 

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

引用传递允许test函数修改指针

于 2012-08-30T15:01:37.007 回答