Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk menyelesaikan ralat masa jalan C++: 'pelanggaran akses'?

Bagaimana untuk menyelesaikan ralat masa jalan C++: 'pelanggaran akses'?

WBOY
WBOYasal
2023-08-27 16:00:461193semak imbas

如何解决C++运行时错误:'access violation'?

Bagaimana untuk menyelesaikan ralat masa jalan C++: 'pelanggaran akses'?

Dalam pengaturcaraan C++, ralat masa jalan adalah salah satu cabaran yang sering kita hadapi. Salah satu ralat biasa ialah 'pelanggaran akses', yang biasanya berlaku apabila cuba mengakses lokasi memori yang tidak sah. Artikel ini menerangkan beberapa sebab dan penyelesaian biasa, serta menyediakan contoh kod yang sepadan.

  1. Akses penuding nol

Akses penuding nol ialah salah satu punca paling biasa ralat 'pelanggaran akses'. Ralat ini berlaku apabila kita cuba mengakses memori yang ditunjuk oleh penuding nol.

Berikut ialah contoh kod:

int* ptr = nullptr;
*ptr = 10; // 此处会发生'access violation'错误

Penyelesaian:
Sebelum mengakses penuding, kita harus menyemak dahulu sama ada ia batal. Ini boleh dicapai dengan menggunakan pernyataan atau penegasan bersyarat.

int* ptr = nullptr;
if (ptr != nullptr) {
    *ptr = 10; // 在访问指针之前先进行空指针检查
}

Atau gunakan penegasan untuk semakan penuding nol

int* ptr = nullptr;
assert(ptr != nullptr); // 运行时将会中断执行
*ptr = 10;
  1. Susun atur akses luar sempadan

Satu lagi punca biasa ralat 'pelanggaran akses' ialah akses luar sempadan tatasusunan. Ralat ini berlaku apabila kami cuba mengakses indeks di luar tatasusunan.

Berikut ialah contoh kod:

int arr[5];
for (int i = 0; i <= 5; ++i) {
    arr[i] = i; // 此处会发生'access violation'错误
}

Penyelesaian:
Apabila mengakses tatasusunan, kita harus memastikan bahawa nilai indeks berada dalam julat sah tatasusunan.

int arr[5];
for (int i = 0; i < 5; ++i) {
    arr[i] = i; // 索引值在有效范围内
}
  1. Akses penuding objek

Satu lagi kesilapan biasa ialah mengakses melalui penuding objek yang telah dipadamkan atau dikeluarkan.

Berikut ialah contoh kod:

class MyClass {
public:
    void doSomething() { /* ... */ }
};

MyClass* ptr = new MyClass;
delete ptr;
ptr->doSomething(); // 此处会发生'access violation'错误

Penyelesaian:
Sebelum menggunakan penuding, anda harus memastikan objek yang ditunjukkannya wujud.

MyClass* ptr = new MyClass;
if (ptr != nullptr) {
    ptr->doSomething(); // 在使用指针之前确认其指向的对象存在
}
  1. Mengakses memori yang dibebaskan

Dalam pengaturcaraan C++, kadangkala kami mengeluarkan kawasan memori yang diperuntukkan secara dinamik secara manual. Walau bagaimanapun, jika kita terus menggunakan penunjuk ke memori selepas membebaskannya, ralat 'pelanggaran akses' akan berlaku.

Berikut ialah contoh kod:

int* ptr = new int;
delete ptr;
*ptr = 10; // 此处会发生'access violation'错误

Penyelesaian:
Selepas mengosongkan memori, kita harus memastikan bahawa penunjuk yang menunjuk ke memori tidak lagi digunakan.

int* ptr = new int;
delete ptr;
ptr = nullptr; // 将指针置为空指针,避免误用

Ringkasan:
ralat 'pelanggaran akses' ialah salah satu ralat masa jalan biasa dalam pengaturcaraan C++. Artikel ini menyediakan beberapa sebab dan penyelesaian biasa, bersama dengan contoh kod yang sepadan. Apabila pengaturcaraan dalam C++, kita harus menyemak dengan teliti akses penunjuk dan tatasusunan untuk mengelakkan ralat tersebut.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan ralat masa jalan C++: 'pelanggaran akses'?. 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