Saya baru saja menemukan entri blog ini yang menyebutkan "memori yang menghentak":
program C ++ yang dengan mudah mampu menginjak memori (sesuatu yang mungkin belum pernah Anda dengar jika Anda lahir di dunia kode terkelola.)
Dan sebenarnya saya belum pernah mendengarnya!
Jadi, apa ini, memori yang menginjak, memori yang menginjak? Kapan itu terjadi?
c++
c
memory
memory-management
berkerut
sumber
sumber
Jawaban:
Memori "diinjak" ketika sepotong kode memanipulasi memori tanpa menyadari bahwa potongan kode lain menggunakan memori itu dengan cara yang bertentangan. Ada beberapa cara umum untuk menginjak memori.
Salah satunya mengalokasikan, katakanlah, 100 byte memori tetapi kemudian menyimpan sesuatu yang melewati alamat ke-100. Memori ini mungkin digunakan untuk menyimpan sesuatu yang sama sekali berbeda. Ini sangat sulit untuk di-debug karena masalah akan muncul ketika sesuatu mencoba mengakses korban yang diinjak, dan kode yang menginjaknya mungkin sama sekali tidak terkait.
Yang lainnya adalah mengakses memori setelah dibebaskan. Memori dapat dialokasikan untuk objek lain. Sekali lagi, kode yang menunjukkan masalah mungkin terkait dengan objek yang baru dialokasikan yang mendapat alamat yang sama dan tidak terkait dengan kode yang menyebabkan masalah.
sumber
Seringkali itu adalah buffer overrun; sebagai contoh, kode ini:
akan "menginjak" apa pun yang terjadi di hal berikutnya dalam memori setelahnya
buffer
. Secara umum, 'menghentak' adalah saat memori ditulis secara tidak sengaja.sumber
Jawaban lain pada dasarnya benar, tetapi saya ingin memberikan contoh.
Sampel ini dapat mengarah ke loop tak terbatas (atau mungkin tidak mengarah), karena ini adalah perilaku yang tidak ditentukan.
Variabel yang sangat mungkin
i
dalam memori disimpan tepat setelah array. Jadi mengaksesa[10]
sebenarnya dapat mengaksesi
dengan kata lain dapat mengatur ulang penghitung loop.Saya pikir itu adalah contoh yang baik yang menunjukkan memori "menghentak".
sumber