ホームページ > バックエンド開発 > C++ > C 文字列の初期化で malloc() を使用するとセグメンテーション エラーが発生するのはなぜですか?

C 文字列の初期化で malloc() を使用するとセグメンテーション エラーが発生するのはなぜですか?

Barbara Streisand
リリース: 2024-11-15 05:38:02
オリジナル
885 人が閲覧しました

Why Does Using malloc() with C   string Initialization Lead to Segmentation Faults?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート