我需要一个返回枚举数组的方法,我尝试了:
note_name *AppSettings::getNoteMap(){
note_name notes[] = {..}
}
我在某处读到我应该返回数组第一个元素的地址,所以这就是为什么有一个指针。不过,这给了我一个警告:address of stack memory associated with local variable notes returned
如何摆脱警告并正确返回数组?
您不能从函数句点返回数组。您可以返回指向动态分配的内存块的指针(我不会走这条路),或者将指针(连同大小)作为输出参数,或者返回指向静态数组的指针,或者返回一个vector<T>
或其他一些收藏。
我会使用 astd::vector
或 a std::array
。
std::vector<note_name> foo() {
std::vector<note_name> ret;
// populate 'ret'
return ret;
}
使用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;
}
为此,您需要动态分配数组并返回相应调用返回的指针new
。您不能返回指向函数本地变量的指针,因为函数退出后它将不复存在。使用 new 将确保函数退出后内存在堆上持续存在。std::vector
当您使用 C++ 时,使用并让您的函数返回一个向量的实例会更好
让我们看看你写的:
note_name *AppSettings::getNoteMap(){
note_name notes[] = {..}
}
数组notes
是一个局部变量,函数返回时会自动清理。如果您返回一个指向它的指针,那么您将返回一个指向不再存在的数组的指针。这就是编译器抱怨的原因。
如果数组的大小和内容在编译时已知,则声明数组静态常量。然后您可以返回对数组的引用。语法有点奇怪:
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
. 你可以声明一个局部变量,填充它,然后按值返回。
如果在编译时不知道数组的大小和内容(或者如果您的库没有实现std::array
),请改用 a std::vector
。