C++ 奇怪的程序崩溃

C++ 奇怪的程序崩溃,c++,crash,operator-overloading,C++,Crash,Operator Overloading,我正在尝试为一个练习实现一个String类。这是我的全部代码:(您不需要全部阅读): #包括 使用名称空间std; //****************************************字符串************************ 类字符串{ 私人: char*char_arr; int strlen(常量字符*str){ 整数长度; 对于(长度=0;*(str+length)!='\0';长度++); 返回长度; } 无效strCopy(常量字符*str1,字符*str

我正在尝试为一个练习实现一个String类。这是我的全部代码:(您不需要全部阅读):

#包括
使用名称空间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;
}