C++ 奇怪的程序崩溃
我正在尝试为一个练习实现一个String类。这是我的全部代码:(您不需要全部阅读):C++ 奇怪的程序崩溃,c++,crash,operator-overloading,C++,Crash,Operator Overloading,我正在尝试为一个练习实现一个String类。这是我的全部代码:(您不需要全部阅读): #包括 使用名称空间std; //****************************************字符串************************ 类字符串{ 私人: char*char_arr; int strlen(常量字符*str){ 整数长度; 对于(长度=0;*(str+length)!='\0';长度++); 返回长度; } 无效strCopy(常量字符*str1,字符*str
#包括
使用名称空间std;
//****************************************字符串************************
类字符串{
私人:
char*char_arr;
int strlen(常量字符*str){
整数长度;
对于(长度=0;*(str+length)!='\0';长度++);
返回长度;
}
无效strCopy(常量字符*str1,字符*str2){
整数长度=strlen(str1);
对于(int i=0;i我不确定这是唯一的问题,但您需要在常量字符串和运算符=(常量字符串和rhs)
中返回*this
。请在编译器中启用警告,它应该告诉您“到达函数末尾而不返回”.您的strCopy不会复制尾随的零字节。虽然它没有任何问题,但有点违反直觉
您的复制构造函数使用上述strCopy(),并且不添加零字节,从而使复制的字符串未终止。这同样适用于赋值运算符
您的连接运算符没有为尾随的零字节分配足够的空间(但追加了它)。程序崩溃,因为零字节放在分配的内存块之后。delete char\u arr;
应该是delete[]char_arr;
您能更具体地说明导致崩溃的条件吗?它看起来是随机的吗?是否存在导致崩溃的某些字符串组合?传递空字符串是否只是一个问题?Thanks@ForEveR如果要删除类指针,是否需要删除[]或者它只用于数组?您必须删除[]
分配给新[]
的指针。如果我分配长度为5的字符数组,arr[4]会自动变为“\0”?或者我需要手动设置它?为什么要调用strlength这么多?在string类中只包含一个长度字段不是更容易吗?
#include <iostream>
using namespace std;
// ******************************* String ************************
class String {
private:
char* char_arr;
int strlen(const char* str) {
int length;
for(length=0;*(str+length)!='\0';length++);
return length;
}
void strCopy(const char* str1, char* str2) {
int length = strlen(str1);
for(int i=0;i<length;i++)
str2[i] = str1[i];
}
public:
// --- Constructor ---
String(const char* str) {
int length = strlen(str);
char_arr = new char[strlen(str)+1];
char_arr[length] = '\0';
strCopy(str,char_arr);
}
// --- size Constructor ---
explicit String(int size) {
char_arr = new char[size+1];
char_arr[size+1] = '\0';
}
// --- Destructor ---
~String() {
delete char_arr;
}
// --- Copy Constructor ---
String(const String& rhs) {
char_arr = new char[strlen(rhs.char_arr)+1];
strCopy(rhs.char_arr,char_arr);
}
// --- copy-assignment Constructor
const String& operator=(const String& rhs) {
delete char_arr;
char_arr = new char[strlen(rhs.char_arr)+1];
strCopy(rhs.char_arr,char_arr);
}
// --- operator== ---
bool operator==(const String& rhs) {
int this_length = strlen(char_arr);
int rhs_length = strlen(rhs.char_arr);
if(this_length==rhs_length) {
bool return_value = true;
for(int i=0;i<this_length;i++) {
if(char_arr[i]!=rhs.char_arr[i]) {
return_value = false;
break;
}
}
return return_value;
}
return false;
}
// --- operator+ ---
String operator+(const String& rhs) {
int this_length = strlen(char_arr);
int rhs_length = strlen(rhs.char_arr);
String new_str(this_length+rhs_length);
strCopy(char_arr,new_str.char_arr);
for(int i=0;i<rhs_length;i++) {
new_str.char_arr[i+this_length] = rhs.char_arr[i];
}
new_str.char_arr[this_length+rhs_length] = '\0';
return new_str;
}
// --- print ---
void print() {
cout << char_arr;
}
};
// ~~~~~~~ main ~~~~~~~~~
int main() {
String s = "This is";
String s1 = " My Name";
String s2 = s+s1;
s1.print();
return 0;
}