malloc で割り当てられた構造体での C 文字列の使用
malloc を使用して C 構造体にメモリを割り当てるときは、データの存在を考慮することが重要ですstd::string などの重要なコンストラクターを必要とするメンバー。
問題とコード例
を含む構造体にメモリを割り当てようとする次のコードを考えてみましょう。 std::string member:
#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 オブジェクトにメモリを割り当てる適切な方法は、new や delete などの C メモリ割り当て演算子を使用することです。これらの演算子は、割り当てられたオブジェクトのコンストラクターとデストラクターを自動的に呼び出し、適切な初期化とクリーンアップを保証します。
提供されたコードの場合、解決策は、malloc を new:
example *ex = new example;
代替: Placement New
malloc でメモリを割り当てる必要があるが、それでも C コンストラクターを使用したい場合は、placement new 演算子を使用できます。void *ex_raw = malloc(sizeof(example)); example *ex = new(ex_raw) example;
結論
非自明なデータ メンバーを含む C 構造体を扱う場合は、次の使用が不可欠です。未定義の動作やエラーを回避するために、new と delete を使用した適切なメモリ割り当てテクニック。以上が文字列メンバーを含む C 構造体にメモリを適切に割り当てるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。