2

列挙型の配列を返すメソッドが必要で、次のことを試しました。

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

SOのどこかで、配列の最初の要素のアドレスを返すことになっていることを読んだので、ポインターがあります。これは私に警告を与えています:address of stack memory associated with local variable notes returned

警告を取り除き、配列を正しく返すにはどうすればよいですか?

4

4 に答える 4

3

You cannot return an array from a function, period. You can return a pointer to a dynamically allocated chunk of memory (I wouldn't go this route), or take a pointer (along with the size) as an output argument, or return a pointer to a static array, or return a vector<T> or some other collection.

I would use a std::vector or a std::array.

std::vector<note_name> foo() {
    std::vector<note_name> ret;
    // populate 'ret'
    return ret;
}
于 2012-08-25T18:46:37.887 に答える
1

Use std::vector, std::array, some other collection or dynamic-array (i.e. use new, instead of allocation on stack), since after exit from function-scope your array will be destroyed and you will have pointer, that points on some garbage in memory. I think that you knows about how many values in your enum and if you have C++11 you can use 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 を使用すると、関数が終了した後もメモリがヒープに保持されます。C++ を使用しているstd::vectorため、関数を使用してベクトルのインスタンスを返すようにすることで、はるかに優れたサービスが提供されます。

于 2012-08-25T18:47:23.287 に答える
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. ローカル変数を宣言して入力し、値で返すことができます。

配列のサイズと内容がコンパイル時に不明std::arrayな場合 (またはライブラリが を実装していない場合) は、std::vector代わりに a を使用してください。

于 2012-08-25T19:02:58.100 に答える