【发布时间】:2012-12-05 22:04:05
【问题描述】:
如果一个指针被设置为 NULL,那么任何对它的引用或通过它的引用也不会是 NULL。这是一个可编译的示例,当您尝试运行它时会爆炸:
#include <string>
#include <iostream>
#define NULL 0
class Seedcoat {
public:
//Seedcoat();
std::string Name;
int Weight;
};
class Seed {
public:
//Seed();
std::string Name;
int Weight;
Seedcoat* ItsSeedcoat;
};
class Apple {
public:
//Apple();
std::string Name;
int Weight;
Seed* ItsSeed;
};
int main()
{
///////Apple Objects Begin///////
Apple MyApple;
Seed MySeed;
Seedcoat MySeedCoat;
MyApple.ItsSeed = &MySeed;
MyApple.ItsSeed->ItsSeedcoat = &MySeedCoat;
MyApple.ItsSeed->ItsSeedcoat->Weight = 2;
if ( MyApple.ItsSeed != NULL) {
std::cout << "The weight of the apple seed's seedcoat is " << MyApple.ItsSeed->ItsSeedcoat->Weight <<".\n";
}
MyApple.ItsSeed = NULL;
if ( MyApple.ItsSeed->ItsSeedcoat != NULL) {
std::cout << "The weight of the apple seed's seedcoat is " << MyApple.ItsSeed->ItsSeedcoat->Weight <<".\n";
}
return 0;
}
所以我的问题是:为什么会这样
MyApple.ItsSeed->ItsSeedcoat != NULL
返回真。我认为它不会因为 ItsSeed 设置为 NULL - 但它仍然尝试引用 ItsSeedcoat 的权重值 - 然后我认为它会爆炸,因为 ItsSeed 不存在。我意识到有一些简单的方法可以解决这个问题——这个例子只是为了展示我观察到的行为。这有什么好担心的吗? - 或者这是正常行为?这样做的原因是什么?谢谢。
【问题讨论】:
-
除了给出的答案之外,您应该知道您没有将对象设置为 NULL。您只需将指针设置为 NULL。指针不是对象。指针只指向对象。当你给那个指针赋值时,它之前指向的对象根本不受影响。
-
确实如此。我进行了编辑以澄清。
-
ItsSeed当然存在。它是一个指针,它的值为 NULL。这意味着MyApple.ItsSeed == NULL。所以你实际上在做的是:NULL->ItsSeedcoat != NULL。显然这是一个 NULL 指针取消引用。 NULL 指针取消引用的通常结果是程序会崩溃。 -
对,有效地址不再存在——不是指针本身。我认为人们(基于答案)理解我的意思 - 但随时编辑问题以使其更清楚。谢谢。