首页 > 解决方案 > 如何修复此代码中的“访问冲突读取位置”

问题描述

运行这段代码我得到了一些像这样的错误

'在 Project1.exe 中的 0x778D7FCB (ntdll.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x00000014。

此行出现此错误

~UnivStudnet() {
delete[]major; // error
    }
#include <iostream>
#include <cstring>
using namespace std;

class Person {
private:
    char * name;
public:
    Person(const char * myname) {
        name = new char[strlen(myname) + 1];
        strcpy_s(name, strlen(name), myname);
    }
    ~Person() {
        delete[]name;
    }

    void WhatYourName() const {
        cout << "My name is " << name << endl;
    }
};

class UnivStudnet : public Person {
private:
    char * major;
public:
    UnivStudnet(const char * myname, const char * const mymajor) :Person(myname) {
        major = new char[strlen(mymajor) + 1];
        strcpy_s(major, strlen(major), mymajor);
    }
    ~UnivStudnet() {
        delete[]major;
    }

    void WhoAreYou() const {
        WhatYourName();
        cout << "My major is " << major << endl;
    }
};

int main(void) {

    UnivStudnet st1("kim", "Mathenatics");
    st1.WhoAreYou();
    UnivStudnet st2("hong", "Physiscs");
    st2.WhoAreYou();
    return 0;
}

如何修复此错误?

标签: c++destructor

解决方案


strcpy_s两条线都有错误。

strcpy_s(name, strlen(name), myname);

应该

strcpy_s(name, strlen(myname)+1, myname);

同样

strcpy_s(major, strlen(major), mymajor);

应该

strcpy_s(major, strlen(mymajor)+1, mymajor);

调用新分配的具有不确定值strlen的 char 数组会导致未定义的行为,这是导致崩溃的原因。namemajor


推荐阅读