首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的程序崩溃

奇怪的程序崩溃
EN

Stack Overflow用户
提问于 2013-06-14 18:41:32
回答 2查看 125关注 0票数 0

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

代码语言:javascript
复制
#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;
}

问题出在operator+过载。如果你查看main函数并更改s和s1的值,程序有时会崩溃,有时不会。你知道为什么会发生这种情况吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-14 18:56:25

您的strCopy不会复制尾随的零字节。虽然它没有什么问题,但它有点违反直觉。

您的复制构造函数使用上面的strCopy(),并且不会添加零字节,因此复制的字符串不会终止。赋值运算符也是如此。

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

票数 1
EN

Stack Overflow用户

发布于 2013-06-14 18:47:15

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17106624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档