一类,两个对象和类数据的奇怪行为

问题描述

| 我在这个网站上看过类似的标题,但仍然找不到答案。所以也许有人可以为我澄清一下。 可以说我有
// 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;
............
现在问什么。 data1-> i显示10。 那怎么可能.. PS:这只是一个例子。 谢谢你的指教。     

解决方法

        
data1->i
未初始化,并且可以显示任何相关值。
CFirst *data = new CFirst();
data->i = 10;
data->y = 10.10;
当您对ѭ3the执行上述步骤时,您在动态内存区域(堆/免费存储)上创建了一个新的CFirst对象,并为to6ѭ对象的成员
i
y
分配了值。 对于“ 3”个对象,您刚刚通过以下方式在动态存储区上创建了该对象:
CFirst *data1 = new CFirst();
您没有初始化它们,未初始化的变量可以包含任何有效数字,甚至可以包含垃圾值,只是偶然的情况是
data->i
包含ѭ10you,请注意您没有特定的理由它包含
10
,它可以包含任何内容。 使用UnInitialized成员变量是一个坏主意,理想情况下,应该在Initializer List中初始化成员变量。
CFirst(int p,float q):i(p),y(q)
{ 

}
    ,        您有一个空的构造函数。这意味着除内置类型外,每个数据成员都将默认初始化。 因此ѭ13未初始化,具有垃圾值。该垃圾值似乎是先前的数据,ѭ10。 请注意,可能是10英镑,16英镑甚至17英镑。     ,           现在问什么。 data1-> i显示10。这怎么可能。.PS:这只是一个例子。 那只是垃圾,恰好是10英镑。 现在,如果您问这里使用什么编译器?好吧,可能是编译器在创建先前对象的同一内存中创建了第二个对象。在删除第一个对象和创建第二个对象之间,该内存尚未被任何擦除。但是,没有这样的保证。 无论如何,关于在何处创建对象的详细信息取决于编译器策略,这在任何情况下都可以。因此,您的代码不应假设任何此类事情。