【问题标题】:String Class c++ Heap Errors [closed]字符串类c ++堆错误[关闭]
【发布时间】:2013-01-04 12:04:32
【问题描述】:

我制作了自己的类字符串 它有两个属性 buff 来存储字符串和长度 当我编译我的代码时 它工作正常,但如果我使用它 String 作为对象,我会得到很多错误 错误的原因是什么以及如何防止它们 谢谢

    #include <iostream>
using namespace std;
class String
{
private:
    int length;
    char *buff;
public:

    String operator=(String &);
    String();
    String(String &);
    String(char *);
    int size(char *);
    void copy(char *);
    char getvalue(int);
    char *getbuff(){return buff;}
    void setindex(char,int);
    int getlength();
    void display();
    ~String();
};

String :: String()
{
    length = 1;
    buff = 0;
}

String :: String(String &temp)
{

    length = size(temp.buff);
    buff = new char[temp.length + 1];
    copy(temp.buff);
}

String :: String(char *a)
{
    length = size(a);
    buff = new char [length + 1];
    copy(a);
}

int String :: size(char *a)
{
    int i;
    for(i = 0;a[i] != '\0';i++)
    {
    }
    return i;
}
void String :: copy(char *a)
{
    delete []buff;
    int i;
    length = size(a);
    buff = new char[length + 1];
    for (i=0;i<length;i++)
    {
        buff[i] = a[i];
    }
    buff[i] = '\0';
}

char String :: getvalue(int index)
{
    return buff[index];
}

void String :: setindex(char value,int index)
{
    buff[index] = value;
}

int String :: getlength()
{
    return length;

}
void  String :: display()
        {
            for (int i = 0;i<length;i++)
                cout << buff[i];
        }

String :: ~String()
{
    delete []buff;
}

String String :: operator=(String &temp)
{
    copy(temp.buff);
    return *this;
}

void main()
{
    String a("r");
    String b("ee");
    b = a;
    b.display();
}

【问题讨论】:

  • 您遇到了什么错误?我认为这只是一个练习,因为 C++ 已经有一个字符串类。学习使用 const。并且主要返回 int 不是 void
  • 你需要遵守三法则
  • 我将其保存为我发布的答案..
  • 阅读The Rule of Three,然后阅读this question。如果您仍然不清楚,请阅读一本书。
  • @CashCow 我得到的错误是块类型是有效的

标签: c++ string heap-memory


【解决方案1】:

您的主要错误是您没有重载复制构造函数。

你的班级还有其他问题,但那是你可能遇到的问题。

当您调用b.copy(a) 时,该函数正在接受字符串by value。这意味着它会复制。

默认的复制构造函数会逐个成员地复制。并且您的两个成员都将具有与buff 相同的指针。并且两者都会尝试删除它,从而导致双重删除。

有关您的错误的更多信息,请参阅Rule Of Three

【讨论】:

  • 如果我通过引用调用它会解决它的问题,但它为什么会起作用
  • @user1948105:“通过引用调用它”是什么意思?你的意思是把copy的参数类型改成String&amp;?不,它不会解决问题,它只会隐藏它。你的课仍然会被打破。任何按值获取 String 对象之一的函数都会再次显示错误。
  • @BenjaminLindley 那么我该如何解决它
  • @user1948105:你读过 CashCow 的回答吗?我们正在评论的答案是什么?
  • @BenjaminLindley 是的,我做到了
【解决方案2】:

你没有关注rule of three,下面的函数有一个副本,导致崩溃。

void copy(String a)

然而,你的意思是只复制数据:

b.copy(a.getbuff());

您还可以将引用传递给复制函数:

void copy(String& a);
b.copy(a); // it should be safe now

【讨论】:

  • 我只使用 copy(String) 来澄清问题,每次创建 String 类型的对象时都会遇到相同的错误
  • 尝试传递一个作为参考来测试它。查看我更新的示例代码答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 2013-01-20
  • 2016-02-11
相关资源
最近更新 更多