當使用 malloc() 分配記憶體時如何處理 C 字串初始化?
在 C 中,嘗試使用 malloc() 函數來建立包含 std::string 的結構可能會導致分段錯誤。要理解此問題,請考慮以下範例:
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 }
執行此程式碼時,會發生分段錯誤。發生這種情況是因為使用 malloc() 的簡單記憶體分配無法正確初始化結構內的 std::string 物件。
解:使用new 運算子
解決此問題問題,在處理包含重要建構子的類別或結構(例如std::string)時,避免使用malloc()。相反,使用new 運算子來正確分配記憶體並建構物件:
example *ex = new example; // Allocating memory and constructing the object ex->data = "hello world"; std::cout << ex->data << std::endl;
進階技術:使用malloc() 放置New
或者,如果您堅持的話在使用malloc() 時,您可以採用一種稱為「placement new」的技術:
void *ex_raw = malloc(sizeof(example)); // Raw memory allocation example *ex = new(ex_raw) example; // Placement new to construct the object
但是,為了簡單和安全,強烈建議使用 new 運算子。
以上是為什麼在 C 字串初始化中使用 malloc() 會導致分段錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!