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

时间:2011-06-25 13:34:44

标签: c++ class

我看了这个网站上的类似标题,但仍然找不到答案。所以也许有人可以为我澄清一下。

让我说我有:

// 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-&gt; i显示10。 怎么可能.. PS:这只是一个例子。

谢谢你的建议。

3 个答案:

答案 0 :(得分:2)

  

现在问什么。 data1-&gt; i显示10.怎么可能.. PS:这只是一个例子。

这只是恰好是10的垃圾。

现在,如果你问这里有什么编译器?好吧,可能是编译器在创建上一个对象的同一内存中创建第二个对象。并且在删除第一个对象和创建第二个对象之间,还没有删除任何内存。但是,没有这样的保证。

在任何情况下,关于创建对象的位置的详细信息取决于编译器策略,它可以是任何东西。所以你的代码不应该假设任何这样的东西。

答案 1 :(得分:2)

你有一个空的构造函数。这意味着每个数据成员都会默认初始化,除了内置类型

因此data1->i未初始化且具有垃圾值。垃圾值似乎是之前的数据10

请注意,它可能是100甚至-1295812

答案 2 :(得分:2)

data1->i

未初始化,可以显示该问题的任何值。

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

当您对data执行上述步骤时,您在动态内存区域(堆/ Freestore)上创建了一个新的CFirst对象,并为iy的{​​{1}}分配了值1}}对象。

对于CFirst对象,您刚刚在动态内存区域上创建了对象,

data

你没有初始化它们,未初始化的变量可以包含任何有效的数字甚至是垃圾值,只是偶然的CFirst *data1 = new CFirst(); 包含data->i,请注意,它没有包含{{1}的特定原因},它可以包含任何内容。

使用UnInitialized成员变量是一个坏主意,理想情况下应该初始化初始化列表中的成员变量。

10