Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bilakah Objek Dicipta dengan memcpy dalam C Bermula Sepanjang Hayatnya?

Bilakah Objek Dicipta dengan memcpy dalam C Bermula Sepanjang Hayatnya?

DDD
DDDasal
2024-11-08 18:55:02139semak imbas

When Does an Object Created with memcpy in C   Begin Its Lifetime?

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, &amp;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!

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