代码之家  ›  专栏  ›  技术社区  ›  Paolo Celati

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

  •  1
  • Paolo Celati  · 技术社区  · 9 年前

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

    class Box
    {
        public: char* data;
    };
    int Main()
    {
        Box* a;
        a->data = "Hello World";
        return 0;
    }
    
    5 回复  |  直到 9 年前
        1
  •  2
  •   Bathsheba    9 年前

    Box* a; 声明 指针 Box 对象你永远不会 创造 对象so a 没有任何意义。

    行为写作 a->data 因此 未定义 .

    要么放下指针 Box a; ,或使用 Box* a = new Box(); 在后一种情况下,别忘了打电话 delete a; 否则你会泄露内存。

    最后,写作 a->data = "Hello World"; 可能存在问题: a->数据 然后将是指向 只读 字符串文字;试图修改该缓冲区内容的行为是 未定义 .

    使用 std::string 作为的类型 .

        2
  •  1
  •   Yam Marcovic    9 年前

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

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

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

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

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

        4
  •  1
  •   alain    9 年前

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

    您应该创建 对象,方法是使用 自动存储持续时间 :

    Box a;
    

    或者通过使用 动态存储持续时间 :

    Box* a = new Box;
    

    并在使用后删除:

    delete a;
    
        5
  •  0
  •   songyuanyao    9 年前

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

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

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