Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menyelesaikan ralat masa jalan C++: 'penunjuk tidak sah'?

Bagaimana untuk menyelesaikan ralat masa jalan C++: 'penunjuk tidak sah'?

王林
王林asal
2023-08-26 08:22:492266semak imbas

如何解决C++运行时错误:'invalid pointer'?

Bagaimana untuk menyelesaikan ralat masa jalan C++: 'penunjuk tidak sah'?

Pengenalan:
C++ ialah bahasa pengaturcaraan yang berkuasa, tetapi anda mungkin menghadapi pelbagai ralat masa jalan semasa menulis kod. Salah satu ralat biasa ialah ralat "penunjuk tidak sah". Mesej ralat ini menunjukkan bahawa terdapat penunjuk ke alamat memori yang tidak sah dalam kod. Artikel ini menerangkan cara menyelesaikan ralat ini dan menyediakan contoh kod yang berkaitan.

Apakah penunjuk tidak sah?
Dalam C++, penunjuk ialah pembolehubah yang memegang alamat memori pembolehubah. Penunjuk boleh menunjuk kepada pembolehubah dari sebarang jenis, termasuk integer, titik terapung, aksara, dsb. Ralat 'penunjuk tidak sah' berlaku apabila penunjuk menunjuk ke alamat memori yang tidak sah. Situasi ini biasanya berlaku dalam tiga situasi berikut:

  1. Penunjuk tidak dimulakan atau NULL: Apabila penunjuk tidak dimulakan dengan betul, atau diberikan nilai NULL, ia akan menunjuk ke alamat yang tidak sah.
int* p;
*p = 10;
  1. Penunjuk telah dipadamkan atau dibebaskan: Apabila padam atau bebas digunakan untuk melepaskan memori yang ditunjuk oleh penuding, penuding menjadi penuding tidak sah.
int* p = new int;
delete p;
*p = 10;
  1. Penunjuk melebihi julat memori yang ditunjukkannya: Apabila penuding dinaikkan atau dikurangkan melebihi julat memori yang ditunjukkannya, penuding itu menunjuk ke alamat yang tidak sah.
int arr[5] = {1, 2, 3, 4, 5};
int* p = &arr[0];

p = p + 10;
*p = 10;

Bagaimana untuk menyelesaikan ralat 'penunjuk tidak sah'?
Untuk membetulkan ralat 'penunjuk tidak sah', kita perlu mengikuti langkah berikut:

  1. Mulakan penuding dan pastikan ia menghala ke alamat memori yang sah: Sebelum menggunakan penuding, pastikan dahulu penuding telah dimulakan dengan betul dan menunjuk ke alamat memori yang sah. Anda boleh menetapkan alamat yang sah kepada penunjuk, atau memulakannya kepada NULL.
int* p1 = new int;
*p1 = 10;

int* p2 = nullptr;
p2 = new int;
*p2 = 20;
  1. Elakkan berulang kali melepaskan memori yang ditunjuk oleh penunjuk: Apabila memadamkan memori yang ditunjuk oleh penunjuk, kita hanya perlu memanggil padam atau membebaskan apabila ia tidak diperlukan lagi. Pastikan untuk melepaskan memori sekali sahaja untuk mengelakkan penunjuk tidak sah.
int* p = new int;
*p = 10;
delete p;
p = nullptr;

// 之后不要再使用指针p
  1. Jangan biarkan penunjuk melebihi julat memori yang mereka tunjuk: Apabila menggunakan penunjuk untuk menambah dan mengurangkan memori, pastikan tidak melebihi julat memori yang mereka tunjuk. Anda boleh menggunakan syarat untuk mengelakkan penunjuk daripada keluar dari skop.
int arr[5] = {1, 2, 3, 4, 5};
int* p = &arr[0];

if (p < &arr[5]) {
    p = p + 10; // 避免指针超出范围
    *p = 10;
}

Kesimpulan:
'penunjuk tidak sah' ialah salah satu ralat masa jalan biasa dalam C++, yang bermaksud terdapat penuding ke alamat memori yang tidak sah dalam kod. Untuk menyelesaikan ralat ini, kita harus memulakan penuding dengan betul dan memastikan ia menunjuk ke alamat memori yang sah, elakkan berulang kali membebaskan memori yang ditunjuk oleh penuding dan elakkan daripada membiarkan penuding melebihi skop memori yang ditunjukkannya.

Dengan mengikuti langkah-langkah di atas, kami boleh menguruskan penunjuk dengan lebih baik dan mengurangkan berlakunya ralat 'penunjuk tidak sah'. Semasa menulis dan menyahpepijat kod, memberi perhatian yang teliti kepada penggunaan penunjuk boleh membantu kami mengesan dan menyelesaikan ralat sedemikian lebih awal dan meningkatkan kualiti dan keteguhan kod.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan ralat masa jalan C++: 'penunjuk tidak sah'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn