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

Bilakah Objek Dicipta dengan memcpy dalam C Bermula Sepanjang Hayatnya?

DDD
Lepaskan: 2024-11-08 18:55:02
asal
219 orang telah melayarinya

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);
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan