在使用malloc 分配的結構中使用C 字串
使用malloc 為C 結構分配記憶體時,考慮資料的存在非常重要需要非平凡構造函數的成員,例如std::string。
問題和程式碼範例
考慮以下程式碼,程式碼嘗試為包含以下內容的結構分配記憶體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; }
此程式碼可能會導致分段錯誤。出現此問題的原因是 malloc 分配的原始記憶體未自動初始化,從而使 std::string 成員處於未初始化狀態。
解決方案:使用 C 記憶體分配運算符
為C物件分配記憶體的正確方法是使用C記憶體分配運算符,例如new和delete。這些運算子會自動呼叫分配物件的建構函數和析構函數,確保正確的初始化和清理。
對於提供的程式碼,解決方案是將malloc 替換為new:
example *ex = new example;
替代方案:Placement New
如果需要使用malloc分配內存,但仍想使用C 構造函數,則可以使用Placement new運算子:
void *ex_raw = malloc(sizeof(example)); example *ex = new(ex_raw) example;
Placement new 允許您可以在記憶體中的特定位置建構一個物件。但是,除非出於特定原因,否則不建議使用這種方法。
結論
在處理包含非平凡資料成員的C 結構時,必須使用使用new 和delete 的正確記憶體分配技術可以避免未定義的行為或錯誤。
以上是如何為帶有字串成員的C結構正確分配記憶體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!