用数字填充数组,然后返回指向该数组的指针

C++ filling an array with numbers then returning a pointer to it

本文关键字:数组 指针 然后 数字 填充 返回      更新时间:2023-10-16

我最近遇到了一个问题,我想不出一个好的方法来解决。我正在使用case结构来尝试将属性设置为将传递给对象构造函数的"字符"。

的例子:

//note this is inside a function with a return type of int*
int selection;
cin >> selection;
int * iPtr;
switch(selection){
case 1:{
     int anArray[6] = {8,5,2,4,250,100} // str, dex, int, luck, hp, mp
     iPtr = anArray;
     return iPtr;
}
//more cases and such below

我遇到的问题是,当我返回指针时,它似乎充满了大量的垃圾,而不是信息,而不是我期望它持有的信息。这是因为数组在作用域结束时被销毁了吗?如果是这样,我应该做些什么来解决这个问题,我希望它(得到一个指针,我想要的值)。

谢谢!

Yes - anArray在堆栈上声明。当函数退出时,它的堆栈帧被回收,因此引用该内存不再有效。如果您希望数组持久存在,请将其分配到堆上:

int* anArray = new int[6]; // and initialize
return anArray;

请记住稍后使用相应的delete[]清除它。

编辑

你应该更喜欢使用一些自动为你管理资源的东西,就像在Praetorian的回答中,这样你就不会意外地泄漏内存。

是的,您声明的数组确实是函数的局部数组,一旦函数退出就不再存在。您可以使用new动态分配数组,然后让调用者delete[]占用内存(但不要这样做!),或者修改您的函数以返回std::unique_ptr而不是原始指针。

unique_ptr<int[]> anArray (new int[6]);
// do initialization
return anArray;

现在,调用者不必担心释放函数分配的内存。

编辑:


有两种不同的方法来执行unique_ptr的初始化。

anArray[0] = 8;
anArray[1] = 5;
// etc ...

int init[6] = {8,5,2,4,250,100};
std::copy( &init[0], &init[0] + 6, &anArray[0] );

是的,这是因为本地数组在程序运行时被覆盖了。您可以在方法中声明静态数组(对于像这样的固定数组来说这是个好主意),在全局范围内声明它,或者用new分配一个数组来返回。最后一种方法使您有机会为每次调用返回不同的数组,但请记住在使用后释放数组。

在c++中,最好的答案是不返回指针。相反,使用一个合适的对象,而不是C数组或手动分配的内存,并返回这个对象:

std::vector<int> f() {
    std::vector<int> array;
    // fill array
    return array;
}

使用new int[x](或其他)在现代c++代码中是真的,真的不赞成的,只有在非常特殊的情况下才被认为是可以接受的。如果在普通代码中使用它,这是一个非常明显需要改进的地方。手动管理内存的其他用途也是如此。c++的全部优势在于,你不必管理自己的内存,从而避免了大量难以跟踪的bug。

是的,这是因为您创建的数组是在堆栈上创建的,当您返回时,您所在的堆栈部分被覆盖(可能是由调试过程)。

为了避免这种情况,你可以写

int* anArray = new int[6];
// fill the array
return anArray;

在这种情况下,您还必须在完成返回结果时删除它,例如在

int* dataArray = getTheArray();
// Use the dataArray
delete [] dataArray;

在堆上分配数组

int* anArray = new int[6];

你必须手动删除它:

delete[] iPtr;