Rumah > Artikel > pembangunan bahagian belakang > Bilakah Objek Dicipta dengan memcpy dalam C Bermula Sepanjang Hayatnya?
Penciptaan Objek Tidak Pasti dengan memcpy dalam C
Dalam C , apabila objek diperuntukkan, penimbal baitnya disalin daripada sumbernya. Walau bagaimanapun, mekanisme tepat penyalinan ini tidak dinyatakan, menimbulkan persoalan tentang jangka hayat objek.
Pertimbangkan coretan kod berikut:
#include <cstdlib> #include <cstring> struct T // trivially copyable type { int x, y; }; int main() { void *buf = std::malloc( sizeof(T) ); if ( !buf ) return 0; T a{}; std::memcpy(buf, &a, sizeof a); T *b = static_cast<T *>(buf); b->x = b->y; free(buf); }
Dalam kod ini, penimbal diperuntukkan menggunakan malloc. Objek boleh salin remeh a kemudiannya disalin ke dalam penimbal ini menggunakan memcpy. Rujukan kepada objek yang disalin disimpan dalam b.
Soalannya ialah: Bilakah jangka hayat objek yang ditunjuk oleh b bermula? Iaitu, apabila ia disalin menggunakan memcpy atau apabila ia ditunjuk oleh b?
Piawaian Tidak Jelas
Piawaian C pada masa ini senyap mengenai isu ini. Kertas kerja bertajuk "Seumur Hidup Objek, Pengaturcaraan Peringkat Rendah dan memcpy" mencadangkan agar penggunaan memcpy untuk jenis yang boleh disalin secara remeh diiktiraf sebagai pembinaan objek, tetapi ia belum lagi dibincangkan atau digabungkan ke dalam standard.
Draf Tafsiran Standard
Piawaian draf C 14 mencadangkan bahawa objek dicipta apabila ia ditakrifkan, dicipta menggunakan ungkapan baharu atau dicipta oleh pelaksanaan apabila perlu. Walau bagaimanapun, kes yang diliputi dalam piawaian untuk menyalin jenis yang boleh disalin secara remeh nampaknya hanya merujuk kepada objek sedia ada.
Cadangan untuk Penciptaan Objek Tersirat
Cadangan p0593 cuba ditangani isu ini dengan mentakrifkan operasi penciptaan objek tersirat, termasuk malloc dan memcpy. Cadangan ini belum lagi disemak.
Kesimpulan
Pada masa ini, piawaian C tidak menyatakan bila objek yang dicipta menggunakan memcpy memulakan hayatnya. Oleh itu, kelakuan coretan kod yang disediakan tidak ditentukan. Cadangan p0593 menawarkan penyelesaian yang berpotensi untuk kekaburan ini, tetapi ia masih belum diterima dalam piawaian.
Atas ialah kandungan terperinci Bilakah Objek Dicipta dengan memcpy dalam C Bermula Sepanjang Hayatnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!