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
Lepaskan: 2024-11-15 05:38:02
asal
884 orang telah melayarinya

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

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

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

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan