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 オブジェクトを適切に初期化しないために発生します。
解決策: 新しい Operator を使用する
これを解決するには問題があるため、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
ただし、簡単さと安全性のために、新しい演算子を使用することを強くお勧めします。
以上がC 文字列の初期化で malloc() を使用するとセグメンテーション エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。