c++ - 如何修复此代码中的“访问冲突读取位置”
问题描述
运行这段代码我得到了一些像这样的错误
'在 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;
}
如何修复此错误?
解决方案
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 数组会导致未定义的行为,这是导致崩溃的原因。name
major
推荐阅读
- css - 边距自动未在水平中心对齐项目
- javascript - 是否有将字符串转换为 Tabulator.js 结构数据的数组的函数?
- sql - 如何格式化 SQL 插入以对齐逗号分隔符?
- c++ - 如何使用 boost-di 注入仅在运行时已知的值?
- r - 根据 R 中的条件选择日期
- javascript - 如何在 redux-toolkit 中的 react 组件之外访问 react-redux 存储?
- azure - 如何从运行在 hdinsight 集群上的代码中获取集群详细信息,例如 clusterID
- soap - SOAP - 格式
- react-native - NativeBase FAB 在 React Native 中不起作用
- javascript - GSAP ScrollTrigger 未按预期工作