读取访问冲突 _First 为 nullPtr

Posted

技术标签:

【中文标题】读取访问冲突 _First 为 nullPtr【英文标题】:Read Access Violation _First was nullPtr 【发布时间】:2016-02-11 04:00:26 【问题描述】:

我有一个默认构造函数复制构造函数析构函数赋值 运算符lengthstring 函数。当我调用复制构造函数并尝试打印新 char* 的值时,我得到一个读取访问冲突_First is nullptr。调试器显示 iosfwd 代码并在错误处中断,但我不知道这意味着什么。任何帮助都是极好的。 这是调试器显示错误的地方。

  static size_t __CLRCALL_OR_CDECL length(const _Elem *_First)
           // find length of null-terminated string
        return (*_First == 0 ? 0 // <- this line
            : _CSTD strlen(_First));
        

这些是我的函数(也不是我们不允许使用 STRCPY)

 MyString::MyString()  //default constructor
    string = new char[6];
    int i = 0;
    for (i; i < strlen(string); i++) 
        string[i] = NULL;
    
    string[i] = '\0';


    MyString::MyString(const MyString &s)  //copy constructor
    char* string = new char[strlen(s.string) + 1];
    int i = 0;
    for (i; i < strlen(s.string); i++) 
        string[i] = s.string[i];
    
    string[i] = '\0';


    MyString::~MyString()  //destructor
    delete[] string;
    string = NULL;


    MyString& MyString::operator=(const MyString& s)  //assignment operator
    char* temp = new char[strlen(s.string) + 1];
    int i = 0;
    for (i; i < strlen(s.string); i++) 
        temp[i] = s.string[i];
    
    temp [i] = '\0';
    delete[] string;
    string = temp;
    return *this;


    size_t MyString::length() const  //length of string
    return strlen(string);


    char* MyString::cString()  //string
    return string; 


    int main(int argc, const char * argv[])
    MyString s;
    std::cout << "Empty: '" << s.cString() << "'\n";
    s = "hello";
    std::cout << "After operator=: '" << s.cString() << "'\n";
    
        MyString t(s);
        std::cout << "After copy: '" << t.cString() << "'\n";
        s = t;
    

【问题讨论】:

【参考方案1】:

复制构造函数中的这一行

char* string = new char[strlen(s.string) + 1];

创建一个名为 string 的新局部变量,这意味着永远不会为名为 string 的成员变量赋值。

删除char *

【讨论】:

以上是关于读取访问冲突 _First 为 nullPtr的主要内容,如果未能解决你的问题,请参考以下文章

带有顶点缓冲区的“访问冲突读取位置”

我在删除指针时遇到读取访问冲突[关闭]

**** 访问冲突读取位置处未处理的异常 *******

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

抛出异常:读取访问冲突。 **dynamicArray** 为 0x1118235。发生了

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