用数字填充数组,然后返回指向该数组的指针
C++ filling an array with numbers then returning a pointer to it
我最近遇到了一个问题,我想不出一个好的方法来解决。我正在使用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;
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”