【问题标题】:pointers c++ - access violation reading location指针 c++ - 访问冲突读取位置
【发布时间】:2014-03-23 17:20:02
【问题描述】:

输出:访问冲突读取位置 0x0093F3DC。

我似乎无法找出问题所在。 head 和 next 指针在各自的构造函数中初始化为 null。

class List{ 
public: 
    node *head;
    List(void)  // Constructor      
    { 
        head = NULL; 
    }   
    void insertNode(int f)  
    {
        node *newNode;
        newNode=new node();
        newNode->value = f;
        newNode->next=head;
        head=newNode;
    }   
    void displayList()
    {
        node *ptr=head;
        while (ptr!=NULL)
        {
            cout<<ptr->value<<endl;
            ptr=ptr->next;
        }
    }

    bool search( int val)
    {
        node *ptr= head;
        while (ptr!=NULL)
        {
            if(ptr->value == val)
            {
                return true;
            }
            ptr=ptr->next;
        }
        return false;   
    }

};

【问题讨论】:

  • 你正在分配一个节点对象给 ptr,然后用 this->head 覆盖它。那有什么意义呢? ptr->next 有效吗?这就是为什么您使用调试器来单步调试代码和示例变量值的原因。
  • 这么多代码不足以正确回答。
  • 虽然这个函数有内存泄漏但是你应该展示如何将节点添加到列表中。
  • 节点 *ptr = 头;也给了我同样的问题。我以类似的方式显示所有节点,该功能工作正常,这个没有。调试器说在 if 条件下无法读取内存
  • @SohaibJamal 例如,构造函数主体是了解头部如何指向有效内存的最低要求。如果它设置为 NULL(或 C++11 中的 nullptr),然后 head 永远不会指向有效内存,则搜索方法将始终失败,并出现访问冲突/分段错误/应用程序崩溃(或以上所有情况)。

标签: c++ pointers


【解决方案1】:

最有可能的是,最好只声明一个指针,而不是分配一个 Node 实例然后清除新分配的内存(例如,导致悬空内存泄漏)。例如:

bool search( int val)
{
    //
    // Declare the pointer to traverse the data container, assign to the head
    // This works only if head is valid.  It is assumed that head is pointing 
    // to valid memory by the constructor and/or other class member functions.
    //
    node *ptr = this->head;
    while (ptr!=NULL)
    {
        if(ptr->value == val)
        {
            return true;
        }
        ptr=ptr->next;
    }
    return false;   
}

在上面的类实现细节中,内部头指针总是分配给InsertNode内部的newNode内存。因此,每次调用 InsertNode 时 head 都会移动。这是想要的功能吗?

【讨论】:

  • 我没有发现任何区别。我的代码似乎也一样
  • 它只是将 newNode 添加到列表的前面。
  • @SohaibJamal 很可能特定的链表行为必须在原始问题中显示,以便我们其他人理解。是否打算实现通常的单链表行为?对我们来说,做出假设而不是展示设计/行为目标并不是一个好主意。因此,请使用预期和预期的行为更新原始帖子。
  • 它是一个来自数组每个索引的普通单链表
  • @SohaibJamal 为了进一步澄清,单链表用于反转数组?如果是这种情况,那么请仔细研究 std::vector 以及使用rbegin() 将其从末端遍历到前面的能力(例如,从末端开始并遍历到前面的迭代器) .这是家庭作业吗?
猜你喜欢
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多