Rumah >pembangunan bahagian belakang >C++ >Mengapakah Menggunakan malloc() dengan Permulaan rentetan C Membawa kepada Ralat Segmentasi?
Bagaimana untuk Mengendalikan Permulaan Rentetan C Apabila Memori Diperuntukkan dengan malloc()?
Dalam C , cuba menggunakan fungsi malloc() untuk cipta struktur yang mengandungi std::string boleh mengakibatkan ralat pembahagian. Untuk memahami isu ini, pertimbangkan contoh berikut:
struct example { std::string data; }; int main() { example *ex = (example *)malloc(sizeof(*ex)); // Allocating memory for the structure ex->data = "hello world"; // Assigning a value to the std::string member std::cout << ex->data << std::endl; // Printing the value of the std::string member }
Apabila melaksanakan kod ini, ralat pembahagian berlaku. Ini berlaku kerana peruntukan memori mudah menggunakan malloc() tidak memulakan objek std::string dengan betul dalam struktur.
Penyelesaian: Menggunakan Operator baharu
Untuk menyelesaikan masalah ini masalah, elakkan menggunakan malloc() apabila bekerja dengan kelas atau struktur yang mengandungi pembina bukan remeh, seperti std::string. Sebaliknya, gunakan operator baharu untuk memperuntukkan memori dan bina objek dengan betul:
example *ex = new example; // Allocating memory and constructing the object ex->data = "hello world"; std::cout << ex->data << std::endl;
Teknik Lanjutan: Peletakan Baharu dengan malloc()
Sebagai alternatif, jika anda berkeras apabila menggunakan malloc(), anda boleh menggunakan teknik yang dipanggil "peletakan baharu":
void *ex_raw = malloc(sizeof(example)); // Raw memory allocation example *ex = new(ex_raw) example; // Placement new to construct the object
Walau bagaimanapun, amat disyorkan untuk menggunakan operator baharu untuk kesederhanaan dan keselamatan.
Atas ialah kandungan terperinci Mengapakah Menggunakan malloc() dengan Permulaan rentetan C Membawa kepada Ralat Segmentasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!