访问冲突读取位置 0x00000000 cstrings

Posted

技术标签:

【中文标题】访问冲突读取位置 0x00000000 cstrings【英文标题】:Access violation reading location 0x00000000 cstrings 【发布时间】:2014-06-08 22:57:44 【问题描述】:

通过阅读其他 *** 问题,我知道此错误意味着我正在尝试取消引用空指针。但是,我无法弄清楚我的代码在哪里取消引用空指针。我正在尝试将 char* (cstring) 设置为非空值,但出现访问冲突错误。代码如下:

void Data::setName(char const * const name)

    if (this->name)
        delete[] this->name;

    this->name = new char[strlen(name) + 1];    // This is where my code breaks in debug mode
    strcpy(this->name, name);

name 是一个 char* 变量,它被初始化为 null。重载的赋值运算符正在调用 setName:

Data& Data::operator=(const Data& data2)

    //if it is a self copy, don't do anything
    if (this == &data2)
        return *this;

    else
    
        setName(data2.name);    // Here is the call to setName
        return *this;
    

附:看在上帝的份上,请不要告诉我我不应该使用 cstrings!我知道 std::string 更好,但这是针对需要 cstrings 的家庭作业。

【问题讨论】:

请发布您的整个课程,以及您用于测试的 main() 程序。否则,我们只有两个没有逻辑错误(但有其他问题)的函数。 另外:if (this->name) 这不是必须的。调用delete[] 时无需检查nullptr 或NULL。另外,如果我将一个空指针传递给setName 会怎样?你的程序会有未定义的行为,因为 strlen(0) 是 UB。 "另外,如果我将空指针传递给 setName 会怎样?"这正是我的问题所在! 好的。但是如果传递了一个空指针怎么办?您可以忽略它并让程序可能崩溃(这就是 std::string 所做的)。 "看在上帝的份上,请不要告诉我我不应该使用 cstrings!" -- 我认为你应该去你的教授办公室,告诉他/她,除非任务是实现std::string,否则你使用std::string。记住要始终保持眼神交流。 【参考方案1】:

如果这是代码中断的行:

this->name = new char[strlen(name) + 1];

那么name 必须是一个空指针,因为没有其他东西被取消引用namestrlen 函数中被取消引用。只需在调试器中打印变量值即可确定。


另外,在 setter 中使用相同名称的变量,如下所示:

struct A

    void set(int a)this->a = a;
    int a;
;

不是一个好习惯。只需使用:

struct A

    void set(int na)a = na;
    int a;
;

struct A

    void set(int a)a_ = a;
    int a_;
;

【讨论】:

哇,你是对的。看起来我有一个新错误要修复,因为这不应该发生......一旦 *** 允许我,我会接受你的回答。 @chillpenguin - 你知道将 NULL 指针传递给std::string 是未定义的行为,换句话说,即使你使用了std::string,你也可能已经崩溃了。所以也许你不应该修复你的Data 类。您应该修复的是使用 Data 类的代码。 +1.. 很好地回答了这个问题,并通过为 OP 提供一些健康的代码替代方案更进一步! 您的答案中“不好的做法”部分是我的家庭作业中内置的,我无法更改。我只能更改 .cpp 文件,不能更改 .h 文件。在 .h 文件中,函数声明(带参数)和类的成员变量已经存在。是我的导师对成员变量和函数参数使用相同的名称...

以上是关于访问冲突读取位置 0x00000000 cstrings的主要内容,如果未能解决你的问题,请参考以下文章

0xC0000005: 读取位置 0x00000000 时发生访问冲突

在 CandidateVotes.exe 中的 0x50E6F1C0 (ucrtbased.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x00000000

Python Ctypes OSError:异常:访问冲突读取0x00000000

c ++访问冲突写入位置0x00000000

C++:0xC0000005:访问冲突写入位置0x00000000

IXAudio2 - 0xC0000005:访问冲突写入位置 0x00000000