Konteks: Saya mencoba memahami petunjuk, kami baru saja melihatnya beberapa minggu yang lalu di sekolah dan saat berlatih hari ini saya bertemu dengan orang bodoh? masalah, ini bisa sangat mudah bagi Anda tetapi saya memiliki sedikit atau tidak ada pengalaman pemrograman.
Saya telah melihat beberapa pertanyaan di SO tentang menghapus pointer tetapi semuanya tampaknya terkait dengan menghapus kelas dan bukan pointer 'sederhana' (atau apa pun istilah yang tepat), inilah kode yang saya coba Lari:
#include <iostream>;
using namespace std;
int main() {
int myVar,
*myPointer;
myVar = 8;
myPointer = &myVar;
cout << "delete-ing pointers " << endl;
cout << "Memory address: " << myPointer << endl;
// Seems I can't *just* delete it, as it triggers an error
delete myPointer;
cout << "myPointer: " << myPointer << endl;
// Error: a.out(14399) malloc: *** error for object 0x7fff61e537f4:
// pointer being freed was not allocated
// *** set a breakpoint in malloc_error_break to debug
// Abort trap: 6
// Using the new keyword befor deleting it works, but
// does it really frees up the space?
myPointer = new int;
delete myPointer;
cout << "myPointer: " << myPointer << endl;
// myPointer continues to store a memory address.
// Using NULL before deleting it, seems to work.
myPointer = NULL;
delete myPointer;
cout << "myPointer: " << myPointer << endl;
// myPointer returns 0.
}
Jadi pertanyaan saya adalah:
- Mengapa kasus pertama tidak berhasil? Tampaknya penggunaan paling mudah untuk menggunakan dan menghapus penunjuk? Kesalahan mengatakan memori tidak dialokasikan tetapi 'cout' mengembalikan alamat.
- Pada contoh kedua kesalahan tidak dipicu tetapi melakukan cout nilai myPointer masih mengembalikan alamat memori?
- Apakah # 3 benar-benar berfungsi? Sepertinya berhasil bagi saya, penunjuk tidak lagi menyimpan alamat, apakah ini cara yang tepat untuk menghapus penunjuk?
Maaf untuk pertanyaan yang panjang, ingin membuatnya sejelas mungkin, juga untuk menegaskan kembali, saya memiliki sedikit pengalaman pemrograman, jadi jika seseorang dapat menjawab ini menggunakan istilah awam, itu akan sangat dihargai!
delete
apa kamunew
. Itu juga tidak diperlukan untuk pointer untuk mengatur dirinya sendiri ke NULL setelah Anda menghapusnya. Jika Anda menginginkan keamanan di sana, gunakan penunjuk cerdas, yang membebaskan memori untuk Anda dan memberikan kesalahan saat Anda mencoba mengaksesnya ketika tidak ada sesuatu.