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

时间:2016-02-23 07:53:02

标签: c++ class nullreferenceexception

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

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

5 个答案:

答案 0 :(得分:2)

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的类型会好得多。

答案 1 :(得分:1)

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

你应该通过在堆栈上创建一个Box对象"" 自动存储持续时间

Box a;

或在堆上创建#34;" 动态存储持续时间

Box* a = new Box;

并在使用后将其删除:

delete a;

答案 2 :(得分:1)

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

你应该确保它指向有效的东西,如:

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

a未初始化(或已分配),它只是一个悬垂的指针。对它的任何解除引用都是Undefined behavior

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

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