c++ - 在 C++ 中连接两个自定义字符串对象?

标签 c++ string memory dynamic

我正在为作业定义自己的字符串类。我注意到以下代码

class MyString {
public:
    MyString(const char* s = NULL) {len = strlen(s); str = new char[len + 1]; strcpy(str, s);}
    ~MyString() {delete [] str;}
    friend ostream& operator << (ostream& ost, const MyString& s) { ost << s.str; return ost;}
    friend MyString operator + (const MyString &s1, const MyString &s2) { 
        int length = strlen(s1.str) + strlen(s2.str); 

        char *str = new char[length + 1];
        strcpy(str, s1.str);
        strcat(str, s2.str);
        return MyString(str);
    }
private:
    char * str;
    int len;
};

int main () {
    MyString s1 = MyString("hello");
    MyString s2 = MyString("world");
    cout << s1 + s2 << endl;
    return 0;
}

有效,因为返回对象是在最后一刻创建的。但是下面的代码

class MyString {
public:
    MyString(const char* s = NULL) {len = strlen(s); str = new char[len + 1]; strcpy(str, s);}
    ~MyString() {delete [] str;}
    friend ostream& operator << (ostream& ost, const MyString& s) { ost << s.str; return ost;}
    friend MyString operator + (const MyString &s1, const MyString &s2) { 
        int length = strlen(s1.str) + strlen(s2.str); 
        MyString temp;
        temp.str = new char[length + 1];
        strcpy(temp.str, s1.str);
        strcat(temp.str, s2.str);
        return temp;
    }
private:
    char * str;
    int len;
};

int main () {
    MyString s1 = MyString("hello");
    MyString s2 = MyString("world");
    cout << s1 + s2 << endl;
    return 0;
}

不,给我一个运行时错误。因此,如果在重载运算符中定义、修改和返回了一个临时对象,为什么第二种方法会失败,我感到很困惑。

最佳答案

问题是,当您在此处默认构造 temp 时:

MyString temp;

你必须执行:

MyString(const char* s = NULL) {len = strlen(s); ... }
空指针上的

strlen 未定义。如果您改为将默认参数更改为:

MyString(const char* s = "")

然而,这两种解决方案仍然很差,因为它们都泄漏了内存。在前者中,您永远不会delete[] 临时str。在后者中,您的默认构造函数分配了一个新的 str 成员,然后您立即用一个新分配的 str 成员覆盖它。原件泄露。

关于c++ - 在 C++ 中连接两个自定义字符串对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33416965/

相关文章:

c++ - 在 Code::Blocks 中设置 SFML 时遇到问题

c++ - 没有运算符 "=="匹配这些操作数

Java - 仅使用 .substring 过程在字符串中查找多个单词

python - 根据标签列表中单词的索引位置查找字符串中单词的开始和结束位置

c - 内存到内存传输优化,如何不memcpy?

C++ 新手 : Having all sorts of problems linking

c++ - 我在哪里可以找到一个好的 boost 引用?

java - 我不明白为什么这个简单的语句不起作用

c++ - 将读取的内存过程存储在缓冲区中,然后对其进行搜索

c++ - 内存编辑功能