0xC0000005:访问冲突读取位置 0x00000000。重载 == 运算符的问题
0xC0000005: Access violation reading location 0x00000000. issues with overloaded == operator
您好,我目前正在为我正在学习的数据结构课程开发一个程序,并且我正在研究重载提取运算符的一部分。我目前收到错误 Access violation reading location 0x00000000。当我试图将两个 My String 对象相互比较时。一个MyString对象本质上是一个c String,这里是class定义
class MyString {
private:
char* str;
public:
MyString();
MyString(const char*);
MyString(const MyString&);
~MyString();
int length() const;
void read(istream&, char);
static const int MAX_INPUT_SIZE = 127;
MyString& operator=(const MyString&);
MyString& operator +=(const MyString&);
friend MyString operator +(const MyString&, const MyString&);
char operator[](int location)const;
char& operator[](int location);
friend ostream& operator<<(ostream&, const MyString&);
friend istream& operator>>(istream&, MyString&);
friend bool operator <(const MyString& left, const MyString& right);
friend bool operator <=(const MyString& left, const MyString& right);
friend bool operator >(const MyString& left, const MyString& right);
friend bool operator >=(const MyString& left, const MyString& right);
friend bool operator ==(const MyString& left, const MyString& right);
friend bool operator !=(const MyString& left, const MyString& right);
};
}
#endif
这是抛出异常的重载 == 运算符
bool operator ==(const MyString& left, const MyString& right) {
return strcmp(left.str, right.str) == 0;
}
这是我进行比较的上下文,假设 temp 是一个有效的 MyString 对象。
for (int i = 0; i < sizeof(cs_measure::Measure::unitStrings); i++) {
if (cs_measure::Measure::unitStrings[i] == temp) {
readMe.unit = i;
in >> readMe.unit;
}
}
这是 for 循环中引用的数组
const MyString Measure::unitStrings[] =
{ "dram", "tsp", "tbsp", "oz", "cup", "pint",
"qt", "gal", "peck", "bushel", "barrel", "acre_ft" };
这是我第一次在堆栈溢出上发帖,所以我遗漏了任何可能对解决此问题有用的重要信息,请告诉我,我很乐意提供帮助。
如评论中所述,sizeof(cs_measure::Measure::unitStrings)
是 而不是 数组 cs_measure::Measure::unitStrings
中的项目数。它是数组在内存中占用的字节数。
由于以字节为单位的大小几乎肯定大于元素的数量,您将在循环中访问数组 out-of-bounds,从而导致未定义的行为。
您可以使用
获取 built-in 数组中的项目数
std::size(cs_measure::Measure::unitStrings)
自 C++17 起(如果您尚未包含任何容器库 header,则可能需要 #include<iterator>
)。
或者如果你不能使用 C++17,你可以定义你自己的版本,尽管 C++17 标准版本更强大一些。 (来自 cppreference.com):
template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
return N;
}
您好,我目前正在为我正在学习的数据结构课程开发一个程序,并且我正在研究重载提取运算符的一部分。我目前收到错误 Access violation reading location 0x00000000。当我试图将两个 My String 对象相互比较时。一个MyString对象本质上是一个c String,这里是class定义
class MyString {
private:
char* str;
public:
MyString();
MyString(const char*);
MyString(const MyString&);
~MyString();
int length() const;
void read(istream&, char);
static const int MAX_INPUT_SIZE = 127;
MyString& operator=(const MyString&);
MyString& operator +=(const MyString&);
friend MyString operator +(const MyString&, const MyString&);
char operator[](int location)const;
char& operator[](int location);
friend ostream& operator<<(ostream&, const MyString&);
friend istream& operator>>(istream&, MyString&);
friend bool operator <(const MyString& left, const MyString& right);
friend bool operator <=(const MyString& left, const MyString& right);
friend bool operator >(const MyString& left, const MyString& right);
friend bool operator >=(const MyString& left, const MyString& right);
friend bool operator ==(const MyString& left, const MyString& right);
friend bool operator !=(const MyString& left, const MyString& right);
};
}
#endif
这是抛出异常的重载 == 运算符
bool operator ==(const MyString& left, const MyString& right) {
return strcmp(left.str, right.str) == 0;
}
这是我进行比较的上下文,假设 temp 是一个有效的 MyString 对象。
for (int i = 0; i < sizeof(cs_measure::Measure::unitStrings); i++) {
if (cs_measure::Measure::unitStrings[i] == temp) {
readMe.unit = i;
in >> readMe.unit;
}
}
这是 for 循环中引用的数组
const MyString Measure::unitStrings[] =
{ "dram", "tsp", "tbsp", "oz", "cup", "pint",
"qt", "gal", "peck", "bushel", "barrel", "acre_ft" };
这是我第一次在堆栈溢出上发帖,所以我遗漏了任何可能对解决此问题有用的重要信息,请告诉我,我很乐意提供帮助。
如评论中所述,sizeof(cs_measure::Measure::unitStrings)
是 而不是 数组 cs_measure::Measure::unitStrings
中的项目数。它是数组在内存中占用的字节数。
由于以字节为单位的大小几乎肯定大于元素的数量,您将在循环中访问数组 out-of-bounds,从而导致未定义的行为。
您可以使用
获取 built-in 数组中的项目数std::size(cs_measure::Measure::unitStrings)
自 C++17 起(如果您尚未包含任何容器库 header,则可能需要 #include<iterator>
)。
或者如果你不能使用 C++17,你可以定义你自己的版本,尽管 C++17 标准版本更强大一些。 (来自 cppreference.com):
template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
return N;
}