为什么分配成员会引发 NullReferenceException
Why does assigning a member raise NullReferenceException?
我一直在尝试让这段代码工作一段时间了,不幸的是,我总是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 Box
或Box b; Box* a = &b
使指针有效。
Box* a = new Box;
a->data = "Hello World";
...
delete a;
- 没有找到相关文章