3

このInformit C++ ガイドで、私はこれを読みました:

を使用malloc()して非 POD オブジェクトを作成すると、未定義の動作が発生します。

//disastrous!
std::string *pstr =(std::string*)malloc(sizeof(std::string));

私はここで2点を理解していませんでした:

  • ポインターは POD です。では、なぜここで非 POD と呼ばれるのでしょうか。(おそらく、POD をよりよく理解する必要があります。)
  • どうしてこれがそんなに悲惨なことになるのでしょうか? (これには文字列の内部構造を理解する必要があると思います。)

説明してください!

4

2 に答える 2

5

ポインタは POD であるのに、なぜここで非 POD と呼ばれるのか

ポインターについてではなく、std::string.

mallocはコンストラクターを呼び出さないため、悲惨です。そのため、適切に構築されていないをpstr指すstd::stringポインターが得られます。std::stringメモリーは割り当てられましたが、コンストラクター呼び出しが欠落しているため、適切に初期化されませんでした。

正しい方法は

std::string *pstr = new std::string;

きれいな方法は、変数を自動ストレージに入れることです。

std::string str;
于 2012-07-07T06:53:48.493 に答える
1

ここでは、標準文字列へのポインタを割り当てるのではなく、標準文字列を割り当てています。mallocに渡していることに注意してください。それはあなたが取り戻しているメモリの量です...オブジェクトのサイズはポインタのサイズよりも大きいことに注意してください。ポインターのみを割り当てている場合、渡されるサイズは.sizeof(std::string)sizeof(std::string*)

返されるポインターは、割り当ての結果を追跡する方法ですが、そのポインターはヒープ上にありません。ここでは、通常の変数に格納されているだけです。代わりにポインターを割り当てた場合、それを追跡するための変数は、ポインターへのポインターである必要があります。

とにかく、あなたが望むなら、次のようにポインタを標準文字列に合法的に割り当てることができます:

std::string str;
std::string** ptr_to_pstr = (std::string**)malloc(sizeof(std::string*);
*ptr_to_pstr = &str;

なぜあなたがしたいのかは完全には明らかではありません。しかし、C++ で malloc を使用する理由も明らかではありません。:)

于 2012-07-07T07:03:14.887 に答える