为什么分配成员会引发 NullReferenceException?

Why does assigning a member raise NullReferenceException?

我一直在尝试让这段代码工作很长一段时间,不幸的是,我总是 NullReferenceException。我发现如果不使用指向 class 的指针,这段代码就可以工作,但我不明白为什么指针会导致此异常。顺便说一句,我对 C++ 不是很有经验,所以你能以简单的方式解释一下。提前致谢。

class Box
{
    public: char* data;
};
int Main()
{
    Box* a;
    a->data = "Hello World";
    return 0;
}

a 未初始化(或分配),它只是一个悬空指针。对它的任何取消引用都将是 Undefined behavior

您可以 Box* a = new BoxBox b; Box* a = &b 使指针有效。例如

Box* a = new Box;
a->data = "Hello World";
...
delete a;

Box* a; 声明一个指向 Box 对象的 指针 。您永远不会 创建 一个 Box 对象,因此 a 不会指向任何东西。

因此 a->data 的行为是 未定义

要么放下指针以获得 Box a;,要么使用 Box* a = new Box();。在后一种情况下,不要忘记在某些时候调用 delete a; 否则你会泄漏内存。

最后,写 a->data = "Hello World"; 可能会有问题:a->data 将成为指向 只读 字符串文字的指针;尝试修改该缓冲区内容的行为是 undefined.

最好使用 std::string 作为 a 的类型。

指向Box对象的指针不是Box对象。指针 Box* a 指向一个不存在的对象,这就是当您尝试将 "Hello World" 分配给成员时出现错误的原因。

您应该创建一个 Box 对象,方法是创建它 "on the stack" 并且 自动存储持续时间 :

Box a;

或通过 "on the heap" 创建它 动态存储持续时间 :

Box* a = new Box;

使用后删除:

delete a;

一个指针只是指向一个(希望如此)分配的内存块。在您的示例中,指针未初始化,因此您试图设置您无权访问的内存。

你应该确保它指向有效的东西,像这样:

int Main()
{
    Box box; // stack allocation
    Box* a = &box; // you could also call new Box; here
    a->data = "Hello World";
    return 0;
}

a 的值未定义,因为您从未将其设置为任何值。因此,任何事情都有可能发生。最有可能的是你访问了不属于你的内存,触发了段错误或类似的访问异常。事情是这样的。

不要这样做。根据已定义的相同类型变量的地址定义您的地址。