2012-08-25 73 views
2

我需要返回枚举阵列的方法的数组,我想:函数返回枚举

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

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

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

+0

可能的重复[可以访问本地变量的内存超出其范围?](http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-范围) –

回答

4

您不能从函数period中返回数组。你可以返回一个指向动态分配的内存块的指针(我不会去这条路径),或者把指针(和大小一起)作为输出参数,或者返回一个指向静态数组的指针,或者返回一个vector<T>或其他收藏品。我想用std::vectorstd::array

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

使用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; 
} 
2

要做到这一点这样你就需要动态分配数组并返回该得到由相应的调用返回到new指针。您不能将指针返回到函数本地的变量,因为函数退出后它将不再存在。使用new将确保内存在函数退出后保留在堆上。当您使用C++,你会使用std::vector,并可以更好的服务你的函数返回一个向量的实例

+0

另外,使用'new'时,确保接收函数在完成时调用'delete'。'shared_ptr'或'unique_ptr'也可能是合适的。 – MartyE

+0

@MartyE boost :: shared_array会更好。 – ForEveR

1

让我们来看看你写的:

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。你可以声明一个局部变量,填入它,然后返回的值

如果大小和阵列的内容在编译时已知的(或者,如果你的库没有实现std::array),使用std::vector代替。

+0

如果我想返回它,矢量是否也需要是静态的? – networkprofile

+1

如果您按价值归还它,您应该这样做。 –