私は、関数のスタックに割り当てられた変数は、関数の実行が終了するとアクセスできなくなることを知っています。しかし、ベクトル型は、どのように割り当てられても、その要素をヒープに割り当てます。したがって、たとえば、"スタック"に割り当てられたベクトルを関数から関数に渡すことはできますか?
vector<int> A;
は、スタックの代わりにヒープ上にその要素のための領域を割り当てます。
私の質問は、私は次のコードを持っていると仮定されています。主な機能には、ベクトル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はヒープ上にその要素を割り当てますが、スタック自体に割り当てられたいくつかの「オーバーヘッド」パラメータ(おそらくベクトルのサイズ)を持っています。したがって、これらのパラメータが別の割り当てによって上書きされると、メイン関数でベクタを使用するとメモリアクセスの問題が発生する可能性があります。何か案は?
あなたのロジックでは、 'int add(int a、int b){int r = a + b;あなたの 'initVector'と同じ問題があるはずです... – delnan
' A(size); '=>' A 'はスタック上にありますが、ポインタが指すメモリ位置はヒープ上にあります。 'size'個の連続したメモリ位置はヒープ上にあり、ベクトルクラスはヒープ上の先頭要素へのポインタを保持します。誰かが私を訂正するかどうかを見てみましょう。 –
Mahesh
TBH、私はこの種のことにも幾分混乱してきました。私が疑問を持ったときはいつも、私はベクトルも割り当てました。例えば、 'ベクトル * a; a =新しいベクトル; 'ポインタを返します。 –