【问题标题】:Process returned -1073741819 (0xC0000005) problem on insertion of value插入值时进程返回 -1073741819 (0xC0000005) 问题
【发布时间】:2019-04-28 07:43:38
【问题描述】:

我正在尝试创建一个 AVL 树并在其中插入一个节点。每当我尝试在树节点中添加数据值时,我的程序都会崩溃并返回值 0xC0000005。这是我在头文件中引入数据项的方式:

class AVLTreeNode
{
    public:
        int data;
        AVLTreeNode();
        virtual ~AVLTreeNode();
        AVLTreeNode(int d, AVLTreeNode *leftChild, AVLTreeNode *rightChild);
        AVLTreeNode *leftc;
        AVLTreeNode *rightc;
        int height;
}

每当我尝试在插入函数中运行以下代码行时,都会崩溃。

AVLTreeNode *nw = NULL ;
nw->data = v;

我不知道我做错了什么,请帮助我。

【问题讨论】:

  • AVLTreeNode *nw = NULL ; nw->data = v; 这是未定义的行为。而是创建一个对象。
  • 指针必须指向一个实例(也称为对象)才能使用其中的方法和变量。您现在说AVLTreeNode *nw 是“NULL”。然后,您正在访问 NULL 指针以设置值。确保指针指向一个对象
  • @PeterRuderman 你为什么一直添加窗口?这里没有理由有一个 windows 标签。
  • 返回码 0xC0000005 是特定于 Windows 的。当您的程序因访问冲突而崩溃时,就会发生这种情况。
  • 这位 OP 显然是个初学者,但这确实意味着他不认真。他花时间将崩溃范围缩小到特定行,并根据本网站的要求发布了minimal reproducible example。了解0xC0000005返回码的含义也很有用,一般常识。

标签: c++ windows memory


【解决方案1】:
AVLTreeNode *nw = NULL;

这行代码将nw设置为空指针,换句话说,它不指向任何东西。尝试取消引用空指针将导致未定义的行为。您需要为AVLTreeNode 对象分配内存,然后让nw 指向它。

你需要的是这个,它分配内存并将nw指向它:

AVLTreeNode *nw = new AVLTreeNode;

请记住,每当您使用 new 分配内存时,您都需要在完成后释放它:

delete nw;

【讨论】:

  • “换句话说,它指向胡言乱语” - 不,这不是它的意思。 NULL(或nullptr)是指定值,表示指针不指向任何地方。 “尝试访问空指针总是会给您带来运行时错误。” - 再次不正确。访问空指针总是安全的。另一方面,取消引用空指针会导致未定义的行为。这可能会也可能不会导致运行时错误。
  • 我想我找到了问题的答案,谢谢您的回答
  • @IInspectable 你说的很对,我已经更新了我的帖子以反映你的更正。
  • “尝试取消引用空指针总是会导致运行时错误。” - 不正确。当您取消引用空指针时会发生什么在语言规范中未明确定义。 任何事情都可能发生。如果编译器发现未定义的行为,它可能会拒绝该程序。或者它可以应用不会导致运行时错误的优化。玩转different compilers,看看它们在编译一个表现出未定义行为的程序时会有多大的不同。
【解决方案2】:

0xC0000005的返回码表示STATUS_ACCESS_VIOLATION。 (您可以在 MSDN 上找到这个和其他 NT 状态代码:NTSTATUS Values。)发生错误是因为 NULL 超出了您程序的有效地址范围。在取消引用指针变量之前,您必须为其分配有效对象的地址。例如:

AVLTreeNode* nw = new AVLTreeNode{};
nw->data = v;

【讨论】:

  • 旁注:AVLTreeNode nw; 也应该可以工作。一般的经验法则是避免动态分配,直到它被强加于你。
  • AVL 树是动态分配是最实用的解决方案之一。
  • 节点。射击。出于某种原因,我认为这就是那棵树。节点是的,动态的。树,可能是自动的。
猜你喜欢
  • 2019-06-20
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多