运行此代码,我遇到了这样的错误
'在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使用情况值得怀疑。
major = new char[strlen(mymajor) + 1];
strcpy_s(major, strlen(major), mymajor);
第二个参数tostrcpy_s
是第一个参数指定的缓冲区的分配大小。(我刚刚意识到-基于另一个strlen(major)
未定义的答案,然后再复制到该答案!
您正在分配足够大的缓冲区来容纳字符串,但是随后对strcpy_s的调用表明它major
不够大,无法容纳包括null char在内的整个字符串。
更好:
size_t len = strlen(mymajor) + 1;
major = new char[len];
strcpy_s(major, len, mymajor);
对基类name
参数也重复上述模式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句