Apakah semua pernyataan berikut ini benar?
vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack
vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack
vector<Type*> vect; //vect will be on stack and Type* will be on heap.
Bagaimana memori dialokasikan secara internal Type
dalam vector
wadah STL atau lainnya?
Jawaban:
akan mengalokasikan
vector
, yaitu info header, di stack, tetapi elemen-elemen di toko gratis ("heap").mengalokasikan semuanya di toko gratis.
akan mengalokasikan
vector
pada stack dan banyak pointer di toko gratis, tetapi di mana titik ini ditentukan oleh bagaimana Anda menggunakannya (Anda bisa mengarahkan elemen 0 ke toko gratis dan elemen 1 ke stack, katakanlah).sumber
vector<Type> vect;
karena elemen ada di heap dan info header ada di stack, ketika info header dihapus dari memori, seperti fungsi kembali, apa yang akan terjadi pada memori elemen? Apakah mereka direklamasi dengan info tajuk atau tidak? Jika tidak, apakah ini akan menyebabkan memori bocor?Tidak,
vect
akan ada di stack, tetapi array yang digunakan secara internal untuk menyimpan item akan ada di heap. Item akan berada di array itu.Tidak. Sama seperti di atas, kecuali
vector
kelas akan berada di heap juga.vect
akan berada di tumpukan, itemnya (pointer keType
) akan berada di heap, dan Anda tidak bisa tahu di mana akan menjadiType
titik pointer ke. Bisa di stack, bisa di heap, bisa di data global, bisa di mana saja (mis.NULL
Pointer).BTW implementasi sebenarnya bisa menyimpan beberapa vektor (biasanya berukuran kecil) pada stack sepenuhnya. Bukan berarti saya tahu implementasi seperti itu, tetapi bisa.
sumber
Dengan asumsi implementasi yang sebenarnya memiliki tumpukan dan tumpukan (standar C ++ tidak membuat persyaratan untuk memiliki hal-hal seperti itu) satu-satunya pernyataan yang benar adalah yang terakhir.
Ini benar, kecuali untuk bagian terakhir (
Type
tidak akan ada di tumpukan). Membayangkan:Juga:
Benar kecuali bagian terakhir, dengan contoh penghitung serupa:
Untuk:
ini benar, tetapi perhatikan di sini bahwa
Type*
pointer akan berada di tumpukan, tetapiType
contoh yang mereka tunjukkan tidak perlu:sumber
delete
juga).Hanya pernyataan ini yang benar:
Type*
pointer dialokasikan pada heap, karena jumlah pointer dapat berubah secara dinamis.vect
dalam hal ini dialokasikan pada stack, karena Anda mendefinisikannya sebagai variabel stack lokal.sumber
vektor memiliki internal
allocator
yang bertugas mengalokasikan / membatalkan alokasi memori dariheap
untukvector element
. Jadi, tidak masalah bagaimana Anda membuat vektor,element
selalu dialokasikan padaheap
. Adapun metadata vektor, itu tergantung pada cara Anda membuatnya.sumber