带连接的字符串 class с++

String class with concatenation с++

我最近开始学习 C++,但在使用字符串连接实现我自己的字符串 class 时遇到了问题。 当字符串相加时,调试时出现错误: 我检查了很多行,发现程序在行很短时工作正常,但在行很长时就完全停止工作了 我想我在某处搞砸了我的记忆,但我找不到哪里 我会很高兴得到任何帮助

#include <iostream>
#include <string>
#include <string.h>

using namespace std;

class String
{
private:
    char *data;
    int length;

public:
    ~String();
    String(){};
    String(char*);

    int get_length(){return length;}
    void add_stick();
    String operator+(const String &);
    void show();
    friend istream &operator>>(istream &, String &);
    friend ostream &operator<<(ostream &, const String &);
};

void String::add_stick()
{
    for (int i = 1; i <= length; i++)
    {
        if (i % 2 == 0)
        {
            data[i-1] = '_';
        }
    }
}

String::String(char* str)
{
    length = strlen(str);
    data = str;
}

void String::show()
{
    cout << data;
}

String String::operator+(const String &str)
{
    char* tmp;
    int len = length + str.length;
    tmp = new char (len);
    for (int i = 0; i < this->length; i++)
    {
        tmp[i] = this->data[i];
    }

    int j = 0;
    for (int i = this->length; i < len; i++)
    {
        tmp[i] = str.data[j];
        j++;
    }

    String koko(tmp);
    tmp = nullptr;
    delete[] tmp;
    return koko;
}

String::~String()
{
    data = nullptr;
    delete[] data;
    length = 0;
}

istream &operator>>(istream &in, String &str)
{
    str.data = new char[1000];
    in.getline(str.data, 1000);
    str.length = strlen(str.data);
    return in;
}

ostream &operator<<(ostream &out, const String &str)
{
    out << str.data;

    return out;
}

int main()
{
    String s[5];
    cin >> s[0] >> s[1] >> s[2] >> s[3] >> s[4];

    String str (s[0] + s[1] + s[2] + s[3] + s[4]);

    str.add_stick();

    cout << str;
}

你的代码有很多问题。

  • 你的 operator= 在哪里?您似乎违反了 Rule of Three。这是一个巨大的内存错误。
  • for (int i = 1; i <= length; i++) if (i % 2 == 0) 似乎是一种奇怪的写法 for (int i = 2; i <= length; i+=2)。这工作正常,只是很奇怪。
  • operator+ 没有为空终止符分配足够的字节,因此之后的所有操作都将读取缓冲区末尾。这是一个巨大的内存错误。
  • String(char* str) 不复制数据,它假定传入的指针的所有权。可能 有效,除了 operator+tmp构造一个String,然后删除tmp,所以现在String的数据没有了。这是一个巨大的内存错误。