奇怪的程序崩溃

时间:2013-06-14 10:41:32

标签: c++ crash operator-overloading

我正在尝试为练习实现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;
}

问题在于运算符+重载。如果查看main函数并更改s和s1的值,程序有时会崩溃,有时则不会。任何想法为什么会发生?

2 个答案:

答案 0 :(得分:1)

您的strCopy不会复制尾随零字节。虽然没有任何措辞,但它有点违反直觉。

您的复制构造函数使用上面的strCopy()并且也不会添加零字节,从而使复制的字符串不会终止。这同样适用于赋值运算符。

您的连接运算符dos没有为尾随零字节分配足够的空间(但附加它)。程序崩溃,因为在分配的内存块之后放置了零字节。

答案 1 :(得分:0)

不确定这是唯一的问题,但您需要在*this中返回const String& operator=(const String& rhs)。在编译器中启用警告,它应该告诉你“在没有返回的情况下到达函数结束”。