Menggunakan Rentetan C dalam Struktur yang Diperuntukkan dengan malloc
Apabila memperuntukkan memori untuk struktur C menggunakan malloc, adalah penting untuk mempertimbangkan kehadiran data ahli yang memerlukan pembina bukan remeh, seperti std::string.
Contoh Masalah dan Kod
Pertimbangkan kod berikut yang cuba memperuntukkan memori untuk struktur yang mengandungi ahli std::string:
#include <iostream> #include <string> #include <cstdlib> struct example { std::string data; }; int main() { example *ex = (example *)malloc(sizeof(*ex)); ex->data = "hello world"; std::cout << ex->data << std::endl; }
Kod ini berkemungkinan akan mengakibatkan ralat pembahagian. Isu ini timbul kerana malloc memperuntukkan memori mentah yang tidak dimulakan secara automatik, meninggalkan ahli std::string dalam keadaan tidak dimulakan.
Penyelesaian: Menggunakan Operator Peruntukan Memori C
Cara yang betul untuk memperuntukkan memori untuk objek C adalah dengan menggunakan operator peruntukan memori C, seperti baru dan padam. Pengendali ini secara automatik memanggil pembina dan pemusnah untuk objek yang diperuntukkan, memastikan permulaan dan pembersihan yang betul.
Untuk kod yang disediakan, penyelesaiannya ialah menggantikan malloc dengan yang baharu:
example *ex = new example;
Alternatif: Peletakan Baharu
Jika anda perlu memperuntukkan memori dengan malloc tetapi masih mahu menggunakan pembina C, anda boleh menggunakan operator baharu peletakan:
void *ex_raw = malloc(sizeof(example)); example *ex = new(ex_raw) example;
Peletakan baharu membenarkan anda untuk membina objek di lokasi tertentu dalam ingatan. Walau bagaimanapun, pendekatan ini tidak disyorkan melainkan perlu atas sebab tertentu.
Kesimpulan
Apabila berurusan dengan struktur C yang mengandungi ahli data bukan remeh, adalah penting untuk digunakan teknik peruntukan memori yang betul dengan baharu dan padam untuk mengelakkan tingkah laku atau ralat yang tidak ditentukan.
Atas ialah kandungan terperinci Bagaimana untuk Memperuntukkan Memori dengan betul untuk Struktur C dengan Ahli Rentetan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!