Giả sử một triển khai thực sự có một ngăn xếp và một đống (C ++ tiêu chuẩn không yêu cầu phải có những thứ như vậy) thì tuyên bố đúng duy nhất là tuyên bố cuối cùng.
vector<Type> vect;
//allocates vect on stack and each of the Type (using std::allocator) also will be on the stack
Điều này là đúng, ngoại trừ phần cuối cùng ( Type
sẽ không nằm trong ngăn xếp). Hãy tưởng tượng:
void foo(vector<Type>& vec) {
// Can't be on stack - how would the stack "expand"
// to make the extra space required between main and foo?
vec.push_back(Type());
}
int main() {
vector<Type> bar;
foo(bar);
}
Tương tự như vậy:
vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack
Đúng ngoại trừ phần cuối cùng, với một ví dụ truy cập tương tự:
void foo(vector<Type> *vec) {
// Can't be on stack - how would the stack "expand"
// to make the extra space required between main and foo?
vec->push_back(Type());
}
int main() {
vector<Type> *bar = new vector<Type>;
foo(bar);
}
Dành cho:
vector<Type*> vect; //vect will be on stack and Type* will be on heap.
Điều này là đúng, nhưng lưu ý ở đây là các Type*
con trỏ sẽ nằm trong heap, nhưng các Type
trường hợp chúng chỉ ra không cần phải là:
int main() {
vector<Type*> bar;
Type foo;
bar.push_back(&foo);
}