Rumah >pembangunan bahagian belakang >C++ >Mengapakah Menggunakan malloc() dengan Permulaan rentetan C Membawa kepada Ralat Segmentasi?

Mengapakah Menggunakan malloc() dengan Permulaan rentetan C Membawa kepada Ralat Segmentasi?

Barbara Streisand
Barbara Streisandasal
2024-11-15 05:38:02857semak imbas

Why Does Using malloc() with C   string Initialization Lead to Segmentation Faults?

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!

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