为什么分配成员会引发 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 Box
或 Box 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
的值未定义,因为您从未将其设置为任何值。因此,任何事情都有可能发生。最有可能的是你访问了不属于你的内存,触发了段错误或类似的访问异常。事情是这样的。
不要这样做。根据已定义的相同类型变量的地址定义您的地址。
我一直在尝试让这段代码工作很长一段时间,不幸的是,我总是 NullReferenceException
。我发现如果不使用指向 class 的指针,这段代码就可以工作,但我不明白为什么指针会导致此异常。顺便说一句,我对 C++ 不是很有经验,所以你能以简单的方式解释一下。提前致谢。
class Box
{
public: char* data;
};
int Main()
{
Box* a;
a->data = "Hello World";
return 0;
}
a
未初始化(或分配),它只是一个悬空指针。对它的任何取消引用都将是 Undefined behavior。
您可以 Box* a = new Box
或 Box 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
的值未定义,因为您从未将其设置为任何值。因此,任何事情都有可能发生。最有可能的是你访问了不属于你的内存,触发了段错误或类似的访问异常。事情是这样的。
不要这样做。根据已定义的相同类型变量的地址定义您的地址。