我看了这个网站上的类似标题,但仍然找不到答案。所以也许有人可以为我澄清一下。
让我说我有:
// 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:这只是一个例子。
谢谢你的建议。
答案 0 :(得分:2)
现在问什么。 data1-&gt; i显示10.怎么可能.. PS:这只是一个例子。
这只是恰好是10
的垃圾。
现在,如果你问这里有什么编译器?好吧,可能是编译器在创建上一个对象的同一内存中创建第二个对象。并且在删除第一个对象和创建第二个对象之间,还没有删除任何内存。但是,没有这样的保证。
在任何情况下,关于创建对象的位置的详细信息取决于编译器策略,它可以是任何东西。所以你的代码不应该假设任何这样的东西。
答案 1 :(得分:2)
你有一个空的构造函数。这意味着每个数据成员都会默认初始化,除了内置类型。
因此data1->i
未初始化且具有垃圾值。垃圾值似乎是之前的数据10
。
请注意,它可能是10
,0
甚至-1295812
。
答案 2 :(得分:2)
data1->i
未初始化,可以显示该问题的任何值。
CFirst *data = new CFirst();
data->i = 10;
data->y = 10.10;
当您对data
执行上述步骤时,您在动态内存区域(堆/ Freestore)上创建了一个新的CFirst对象,并为i
和y
的{{1}}分配了值1}}对象。
对于CFirst
对象,您刚刚在动态内存区域上创建了对象,
data
你没有初始化它们,未初始化的变量可以包含任何有效的数字甚至是垃圾值,只是偶然的CFirst *data1 = new CFirst();
包含data->i
,请注意,它没有包含{{1}的特定原因},它可以包含任何内容。
使用UnInitialized成员变量是一个坏主意,理想情况下应该初始化初始化列表中的成员变量。
10