0

ヒープに割り当てられた関数を呼び出そうとしていました。何度か失敗した後、私はこのWebサイトのコードを試しました。

http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/85d5da8c-edef-44b0-b42e-deb5f3eb2524

コードは完璧に機能します。コンパイル、実行、正しい/期待される結果が得られ、問題なく終了します。

ただし、std :: cout << "Hello World!"のようなものを追加しようとすると << std :: endlを関数に入れ、それをヒープにコピーしてから、ヒープ関数を実行します。これは機能しません。そこにカウトがある場合、それは機能しません。カウトがないと機能します。

なぜこれが起こるのか、そしてどうすればこの問題を解決できるのか知りたいです。私はこれを学習の唯一の目的で行っていることを認識し、これを実際の使用法に適用することに興味はありません。

ヒープ関数がstd::coutを使用してデータを出力する関数を呼び出すと、そのコードも機能しません。

4

3 に答える 3

3

あなたが参照している記事では、次のように述べています。

ローカル変数のみを使用し、グローバル変数、静的変数、および定数文字列変数は使用しないでください。

しかしstd::cout、グローバルです。また、記事の用語はやや不正確ですが、文字列リテラルはおそらく「定数文字列変数」として分類されると思います。

他の人が述べているように、このコードの動作は未定義であるため、正確に何が起こるかは実装固有です。コンパイラが異なれば、動作も異なる場合があります。

于 2012-05-14T16:42:35.037 に答える
2

ここでは未定義の動作に依存しており、それが正常な動作をすることを期待しています。

特定のプラットフォームで何が「間違っている」のかを知りたい場合は、デバッガーを使用してマシンコードをステップ実行することをお勧めします。

于 2012-05-14T16:41:49.340 に答える
1

問題はcout、関数にコードを追加するときに、基本的にいくつかの関数呼び出しを追加するという事実にあります。Microsoft C / C ++コンパイラは、実行時の問題を検出するために、いくつかの基本的なスタックフレームチェックを使用します。これらのチェックは__RTC_CheckEsp、各関数呼び出しの後に関数を呼び出すことによって実行されます。の呼び出し__RTC_CheckEspは、相対アドレス指定を意味するE8オペコードを使用します。サンプル関数がヒープに移動される__RTC_CheckEspと、間違った場所にジャンプするため、への呼び出しはエラーになります。

ランタイムスタックフレームチェックを無効にします(Visual Studio 2010の場合):プロジェクトオプション->構成プロパティ-> C /C++ ->コード生成->基本ランタイムチェック->初期化されていない変数に設定します

再コンパイルします。走る。楽しみ!

于 2012-05-14T17:11:09.630 に答える