为什么分配成员会引发 NullReferenceException

Why does assigning a member raise NullReferenceException?

本文关键字:NullReferenceException 分配 成员 为什么      更新时间:2023-10-16

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

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

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

因此,行为编写a->data不确定的。

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

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

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

指针

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

您应该确保它指向有效的内容,如下所示:

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

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

别这样。根据已定义的相同类型的变量的地址定义地址。

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

您应该通过"在堆栈上"创建具有自动存储持续时间Box对象来创建它:

Box a;

或者通过具有动态存储持续时间的"堆上"创建它:

Box* a = new Box;

并在使用后删除:

delete a;

a没有初始化(或分配),它只是一个悬空的指针。对它的任何取消引用都将是未定义的行为。

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

Box* a = new Box;
a->data = "Hello World";
...
delete a;
相关文章:
  • 没有找到相关文章