2

我需要一个返回枚举数组的方法,我尝试了:

note_name *AppSettings::getNoteMap(){
    note_name notes[] = {..}
}

我在某处读到我应该返回数组第一个元素的地址,所以这就是为什么有一个指针。不过,这给了我一个警告:address of stack memory associated with local variable notes returned

如何摆脱警告并正确返回数组?

4

4 回答 4

3

您不能从函数句点返回数组。您可以返回指向动态分配的内存块的指针(我不会走这条路),或者将指针(连同大小)作为输出参数,或者返回指向静态数组的指针,或者返回一个vector<T>或其他一些收藏。

我会使用 astd::vector或 a std::array

std::vector<note_name> foo() {
    std::vector<note_name> ret;
    // populate 'ret'
    return ret;
}
于 2012-08-25T18:46:37.887 回答
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;
}
于 2012-08-25T18:44:03.727 回答
1

为此,您需要动态分配数组并返回相应调用返回的指针new。您不能返回指向函数本地变量的指针,因为函数退出后它将不复存在。使用 new 将确保函数退出后内存在堆上持续存在。std::vector当您使用 C++ 时,使用并让您的函数返回一个向量的实例会更好

于 2012-08-25T18:47:23.287 回答
0

让我们看看你写的:

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

于 2012-08-25T19:02:58.100 回答