Tôi biết rằng các biến được phân bổ trên ngăn xếp của hàm đó trở nên không thể tiếp cận khi hàm kết thúc thực thi. Tuy nhiên, các loại vectơ phân bổ các phần tử của chúng trên heap bất kể chúng được phân bổ như thế nào. Ví dụ:Vectơ được phân bổ trên "ngăn xếp" có được chuyển từ hàm này sang hàm khác không?
vector<int> A;
sẽ phân bổ không gian cho các phần tử trên đống thay vì chồng.
Câu hỏi của tôi là, giả sử tôi có đoạn mã sau:
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;
}
Tôi có vấn đề truy cập bộ nhớ khi sử dụng vector A trong hàm main? Tôi đã thử điều này nhiều lần và tất cả đều làm việc bình thường, nhưng tôi sợ rằng điều này có thể chỉ là may mắn.
Cách tôi thấy nó là, vector A phân bổ các phần tử của nó trên heap, nhưng nó có một số tham số "trên không" (có thể là kích thước của vectơ) được cấp phát trên chính ngăn xếp đó. Do đó, việc sử dụng vec-tơ trong chức năng chính có thể dẫn đến vấn đề truy cập bộ nhớ nếu các thông số này bị ghi đè bởi một phân bổ khác. Bất kỳ ý tưởng?
Theo logic của bạn, 'int add (int a, int b) {int r = a + b; return r} 'nên có cùng một vấn đề mà bạn nghi ngờ cho' initVector' của bạn ... – delnan
'vector A (size);' => 'A' nằm trên stack nhưng các vị trí bộ nhớ nó trỏ đến nằm trên đống. Các vị trí bộ nhớ tiếp giáp 'size' nằm trên heap, trong khi lớp vectơ giữ con trỏ tới phần tử đầu tiên trên heap. Cho phép xem nếu ai đó sửa chữa tôi. –
Mahesh
TBH, tôi đã hơi bối rối bởi loại điều này là tốt. Bất cứ khi nào tôi có bất kỳ nghi ngờ nào, tôi cũng đã phân bổ véc tơ, ví dụ: 'vector * a; a = vectơ mới ; ' và sau đó trả lại con trỏ. –