Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apa yang Berlaku kepada Penunjuk yang Disalin dalam C Selepas Yang Asal Dipadamkan?

Apa yang Berlaku kepada Penunjuk yang Disalin dalam C Selepas Yang Asal Dipadamkan?

DDD
DDDasal
2024-11-01 15:13:02279semak imbas

What Happens to Copied Pointers in C   After the Original is Deleted?

Penunjuk dalam C Selepas Padam

Pertimbangkan coretan kod berikut dalam C :

<code class="cpp">A* a = new A();
A* b = a;
delete a;
A* c = a; // Undefined behavior in C++11
A* d = b; // Potentially legal, but uncertain</code>

Kod ini menaikkan soalan: apakah yang berlaku apabila mengakses nilai penuding yang disalin selepas penuding asal telah dipadamkan?

Dalam C 11, mengakses nilai penuding yang telah dipadamkan membawa kepada tingkah laku yang tidak ditentukan. Ini terpakai kepada kedua-dua petunjuk a dan b. Menyalin nilai a ke dalam c juga tidak ditentukan, sebagai titik kepada memori yang dialokasikan.

Walau bagaimanapun, dalam C 14, tingkah laku menjadi ditentukan pelaksanaan. Piawaian menentukan bahawa:

"Arahan melalui nilai penunjuk tidak sah dan menghantar nilai penunjuk tidak sah kepada fungsi deallocation mempunyai gelagat tidak ditentukan. Sebarang penggunaan lain nilai penunjuk tidak sah mempunyai tingkah laku ditentukan pelaksanaan."

Oleh itu, dalam C 14, mengakses nilai b, yang merupakan salinan a, juga ditakrifkan pelaksanaan. Ia berpotensi membawa kepada gelagat yang tidak ditentukan, tetapi ia juga boleh dikendalikan secara berbeza oleh pelaksanaan tertentu.

Ringkasnya, kedua-dua A* c = a; dan A* d = b; tidak ditakrifkan dalam C 11 dan pelaksanaan-ditakrifkan dalam C 14. Ini kerana kedua-dua penunjuk a dan b menghala ke memori tidak sah selepas operasi pemadaman.

Atas ialah kandungan terperinci Apa yang Berlaku kepada Penunjuk yang Disalin dalam C Selepas Yang Asal Dipadamkan?. 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