2011-06-25 11 views
1

私はこのサイトで類似のタイトルを調べましたが、答えが見つかりませんでした。だから、誰かが私のためにそれを明確にすることができます。クラスデータで1つのクラス、2つのオブジェクト、および奇妙な振る舞い

// Example class 
class CFirst 
{ 
public: 
    CFirst{ } 
    virtual ~CFirst{ } 
    int i; 
    float y; 
}; 

// Other class methods looks like this 
......... 
CFirst *data = new CFirst(); 
data->i = 10; 
data->y = 10.10; 

if (data != NULL) 
{ 
    delete data; 
    data = NULL; 
} 

CFirst *data1 = new CFirst(); 
std::cout<<data1->i<<std::endl; 
............ 

は今何をQUES:

は、私が持っているとしましょう。 data1-> iは10を示します。 どうすれば可能ですか。 PS:単なる例です。

アドバイスをいただきありがとうございます。

答えて

2
data1->i 

は初期化されておらず、その値は任意です。あなたはdataのために、上記の手順を行った場合は

CFirst *data = new CFirst(); 
data->i = 10; 
data->y = 10.10; 

あなたは、動的メモリ領域(ヒープ/ Freestore)に新しいCFirstオブジェクトを作成し、メンバーiCFirstオブジェクトのyに値を割り当てられました。あなただけのあなたがそれらを初期化していない

CFirst *data1 = new CFirst(); 

、によって動的なメモリ領域にオブジェクトを作成しdataオブジェクトに対して

、初期化されていない変数は偶然data->i10が含まれているだけで、何も有効な数字、あるいはごみ値を含めることができますあなたには10が含まれている特別な理由はありませんが、何でも含めることができます。

初期化されていないメンバー変数を使用することは悪い考えです。イニシャライザリストでメンバー変数を理想的に初期化する必要があります。

CFirst(int p, float q):i(p),y(q) 
{ 

} 
+0

ああ、私は今参照してください。あなたの答えはありがとうございました。 – legion

2

今すぐ質問してください。 data1 - >私は10を示しています。どのように可能です.. PS:単なる例です。

これはちょうど10であるごみです。

ここでどのようなコンパイラが尋ねるのですか?まあ、それは、コンパイラが以前のオブジェクトが作成された同じメモリ内に2番目のオブジェクトを作成することかもしれません。そしてそのメモリは、最初のオブジェクトの削除と2番目のオブジェクトの作成の間に、まだ何かによって消去されていません。しかし、そのような保証はありません。

いずれの場合でも、どのオブジェクトが作成されるかなどの詳細は、コンパイラの戦略に左右されます。したがって、あなたのコードはそのようなことを想定すべきではありません。

2

空のコンストラクタがあります。これは、すべてのデータメンバがデフォルトの初期化されることを意味します。以外のです。

したがってdata1->iは未初期化で、ガベージ値を持っています。そのゴミ値は前のデータ、10のようです。

0、さらには-1295812であってもかまいません。

関連する問題