【问题标题】:Function returning an array of enums返回枚举数组的函数
【发布时间】:2012-08-20 22:05:52
【问题描述】:

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

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

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

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

【问题讨论】:

标签: c++ arrays pointers return


【解决方案1】:

您不能从函数中返回数组,句号。您可以返回指向动态分配的内存块的指针(我不会走这条路),或者将指针(连同大小)作为输出参数,或者返回指向静态数组的指针,或者返回 @ 987654321@ 或其他一些集合。

我会使用std::vectorstd::array

std::vector<note_name> foo() {
    std::vector<note_name> ret;
    // populate 'ret'
    return ret;
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 另外,使用new,确保接收函数在完成时调用deleteshared_ptrunique_ptr 也可能是合适的。
    • @MartyE boost::shared_array 会更好。
    【解决方案3】:

    使用std::vectorstd::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;
    }
    

    【讨论】:

      【解决方案4】:

      让我们看看你写了什么:

      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。可以声明一个局部变量,填入,通过value返回。

      如果数组的大小和内容在编译时已知(或者如果您的库没有实现std::array),请改用std::vector

      【讨论】:

      • 如果我想返回它,向量是否也需要是静态的?
      • 如果你按值返回它,你应该这样做。
      猜你喜欢
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      相关资源
      最近更新 更多