抛出异常:写访问冲突 C++

Posted

技术标签:

【中文标题】抛出异常:写访问冲突 C++【英文标题】:Exception thrown: Write access violation C++ 【发布时间】:2022-01-08 00:47:39 【问题描述】:

我想用数字 2 4 6 8 10 12 14 16 18 20 填充 (obj * m)。在 Microsoft Visual Studio Professional 2019 中,我收到此错误:“抛出异常:写入访问冲突”在“n”行-> val = 数据;"或第 15 行。但后来我进入 DEV C++ 应用程序,在那里我意识到错误是什么,由于某种原因,重复开始并且数组通常恶化,粗略地说,不算初始元素。通过运行程序,您将亲眼看到一切,我将它带到那里,一切都清晰可见。

#include <iostream>
using namespace std;
class obj
public:
    int val, k;
    obj* next;
    obj* n;
    int current = 0;
    
    void func(int data)
        for(n = this, k=0; k<current; n = n->next,k++)
            cout<<"k= "<<k<<" = "<<n<<" = "<<n->val<<" curr= "<< current<<", ";
        
        cout<<endl;
        n->val = data;
        current++;
    
    
    void print()
        for(n =this, k = 0; k<10;n = n->next,k++)
        
            cout<<n->val<<"  ";     
        
        
    
;

int main() 
    obj *m;
    m=new obj [100];
    for(int i=2; i<=20;i+=2)
    
        m->func(i);
    
    m->print();
    delete[] m;
    cout << endl;
    return 0;

【问题讨论】:

注意:在obj 的任何实例上,您从未真正将next 设置为任何内容。因此这是未定义的行为,因为您只是随机查看内存。 您真的是要创建一个包含 100 个 obj 实例的数组吗?还是您的意思是创建一个以包含 100 个空节点的链表开始的 obj?无论哪种方式,根本原因是obj-&gt;next 指向无处可产。 查找 std::vector 会减轻你的痛苦。 【参考方案1】:

在您的代码中,next 未初始化,因此nfunc 的迭代过程中指向错误的地址

int main()

    /* ... snipped ... */

    /* Initialize `next` */
    for (int i = 1; i < 100; i++)
    
        m[i - 1].next = &m[i];
    
    m[99].next = nullptr;

    /* snipped */

【讨论】:

这个答案质量太差了,应该被你删除。或者,编辑并更改为 C++。

以上是关于抛出异常:写访问冲突 C++的主要内容,如果未能解决你的问题,请参考以下文章

C++ Int 似乎没有初始化并抛出异常:读取访问冲突

抛出异常:写访问冲突。 temp 为 nullptr

抛出异常:读取访问冲突。 **bp** 为 0xFFFFFFFFFFFFFFFF

将“4W2R”转换为“WWWWRR”错误 - 抛出异常:写访问冲突

C++ Battle4Zion 项目抛出未处理的异常:读取访问冲突。 **this** 是 nullptr。发生了

捕获访问冲突异常?