我需要一个返回枚举数组的方法,我试过了:
note_name *AppSettings::getNoteMap(){
note_name notes[] = {..}
}
我在某处读到了我应该返回数组第一个元素的地址,所以这就是为什么有一个指针。这给了我一个警告:address of stack memory associated with local variable notes returned
如何摆脱警告并正确返回数组?
答案 0 :(得分:3)
您无法从函数句点返回数组。你可以返回一个指向动态分配的内存块的指针(我不会去这条路径),或者将一个指针(连同大小)作为输出参数,或者返回指向静态数组的指针,或者返回一个{ {1}}或其他一些集合。
我会使用vector<T>
或std::vector
。
std::array
答案 1 :(得分:1)
使用std::vector
,std::array
,其他一些集合或dynamic-array
(即使用new
,而不是在堆栈上进行分配),因为从函数范围退出后您的数组将被销毁,你将有指针,指向内存中的一些垃圾。我想您知道enum
中有多少值,如果您有C ++ 11,则可以使用std::array
。
std::array<note_name> foo() {
std::array<note_name, size> ret = { ... }; // fill ret, instead of ...
return ret;
}
答案 2 :(得分:1)
要这样做,您需要动态分配数组并返回相应调用返回的指针new
。您不能返回指向函数本地变量的指针,因为它将在函数退出后停止存在。使用new将确保在函数退出后内存在堆上。在使用C ++时,使用std::vector
可以更好地服务,并使函数返回向量的实例
答案 3 :(得分:0)
让我们来看看你写的内容:
note_name *AppSettings::getNoteMap(){
note_name notes[] = {..}
}
数组notes
是一个局部变量,在函数返回时会自动清理。如果返回指向它的指针,那么您将返回一个指向不再存在的数组的指针。这就是编译器抱怨的原因。
如果在编译时已知数组的大小和内容,则声明数组static const。然后您可以返回对数组的引用。语法有点奇怪:
static const std::size_t note_names_size = 42;
note_name const (&AppSettings::getNoteMap())[note_names_size] {
static note_name const notes[note_names_size] = { ... };
return notes;
}
如果在编译时已知数组的大小,而不是内容,则使用std::array
。您可以声明一个局部变量,填入它,然后通过 value 返回它。
如果阵列的大小和内容在编译时不已知(或者如果您的库未实现std::array
),请改用std::vector
。< / p>