我正在尝试在函数中分配内存,但我不确定我做错了什么。 我想要这个:
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;
}
是否存在范围问题?我想,因为我传给它一个指针,它将被分配,我将能够在初始化函数之外访问它。
感谢您的帮助
答案 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
指针被函数