(私はあなたが上記の投稿が実際いくつかのヘッダファイルからの断片であることを前提としています。)あなたのプログラム内の別のソースファイルは同様に、異なるメモリレイアウト関連の設定でコンパイルされたときにそのような
物事は一般的に起こりますクラスのパッキングとアラインメントの設定。ヘッダーファイルはこれらの異なる翻訳単位に含まれており、メモリレイアウト設定の相違のために解釈が異なります。
これらの翻訳単位間でTest
オブジェクトを渡すと、問題が明らかになります。 1つの翻訳単位では、1つのメモリレイアウトを持つTest
オブジェクトが作成され、別の翻訳単位が読み込まれるか、まったく異なるメモリレイアウトが仮定されます。あなたの場合、インライン関数は各翻訳単位で異なって解釈されます。
メンバー関数を非インライン関数として定義すると、定義されているソースファイルに固有のクラスメモリレイアウトが想定されます。これは、カーペットの下の問題を掃除し、物事を「仕事」にします(アクセス機能は今では1つのメモリレイアウトに結びついているからです)。しかし、まだそれは良い状況ではありません。それはまだ道路の下に同様の性質の様々な問題につながる可能性があります。
プログラム内のすべてのソースファイルが、同じクラスのメモリレイアウト設定でコンパイルされていることを確認してください。
P.S. Fredがコメントで指摘したように、翻訳単位間のクラスメモリレイアウトの相違は、ソースファイルが依存するヘッダーファイルを変更した後にソースファイルを再コンパイルするのを忘れてしまうようなものによって引き起こされる可能性があります。
このような問題のもう1つの「一般的な」原因は、プリプロセッサディレクティブ(すなわち、#ifdef
/#endif
セグメントによってカスタマイズされたクラスレイアウト)に依存するクラス定義です。 #define
ヘッダーファイルを含むソースファイルで重要なことを忘れた場合、そのソースファイルのクラスのメモリレイアウトが異なる可能性があります。
出典
2011-02-09 00:01:38
AnT
私には(コードのどこか他の)初期化されていない変数(ポインタ)のように見えます。 – thbusch
本当に厄介なものを除外しましょう、本当に値が正しく設定されていると思いますか? – Nim
ええ、値が正しく設定されていて、初期化されていない変数ではありません。なぜなら、メンバーのすべてが正しく見えるからです。hファイルはすべて正常に動作します – JumboSmith