関数の実行が終了すると、関数のそのスタックに割り当てられた変数にアクセスできなくなることを知っています。ただし、ベクター型は、割り当て方法に関係なく、要素をヒープに割り当てます。たとえば、
vector<int> A;
スタックの代わりにヒープにその要素のスペースを割り当てます。
私の質問は、次のコードがあると仮定します。
int main(int argc, char *argv[]) {
// initialize a vector
vector<int> A = initVector(100000);
// do something with the vector...
return 0;
}
// initialize the vector
vector<int> initVector(int size) {
vector<int> A (size); // initialize the vector "on the stack"
// fill the vector with a sequence of numbers...
int counter = 0;
for (vector<int>::iterator i = A.begin(); i != A.end(); i++) {
(*i) = counter++;
}
return A;
}
メイン関数でベクトル A を使用すると、メモリ アクセスの問題が発生しますか? これを数回試したところ、すべて正常に機能しましたが、これは運が良かったのではないかと心配しています。
私が見ているように、ベクトル A はその要素をヒープに割り当てますが、スタック自体に割り当てられたいくつかの「オーバーヘッド」パラメーター (おそらくベクトルのサイズ) があります。したがって、メイン関数でベクトルを使用すると、これらのパラメーターが別の割り当てによって上書きされると、メモリ アクセスの問題が発生する可能性があります。何か案は?