+ -
当前位置:首页 → 问答吧 → 怎么说是堆被破坏了?

怎么说是堆被破坏了?

时间:2011-11-28

来源:互联网

这是代码:
C/C++ code
# include <string.h>
# include <iostream>
using namespace std;

class Cstring
{
private:
    char *str;
public:
    Cstring()
    {
        str = new char[10];
        if(str)
            strcpy(str, "Hello");
    }
    Cstring(char *p)
    {
        str = new char[strlen(p)+1];
        if(str)
            strcpy(str, p);
    }
    Cstring(const Cstring &cs)
    {
        str = new char[strlen(cs.str)+1];
        if(str)
            strcpy(str, cs.str);
    }
    Cstring operator +(const Cstring &cs)
    {
        Cstring temp;
        temp.str = new char[strlen(str)+1];
        strcpy(temp.str, str);
        temp.str = (char *)realloc(temp.str, strlen(cs.str) + 1);
        strcat(temp.str, cs.str);
        return temp;
    }
    void show()
    {
        cout<<str<<endl;
    }
    ~Cstring()
    {
        delete []str;
    }
};


int main()
{
    Cstring s1("is a wondful");
    Cstring s2("programming  Language!");
    Cstring s3;
    s3 = s1 + s2;
    s3.show();
    return 0;
}



请问一下,这段代码到底是怎么回事?望大虾们指点一下!谢谢了啊!

作者: JZY4077   发布时间: 2011-11-28

加断点跟下看看

作者: W170532934   发布时间: 2011-11-28

这应改:
C/C++ code
# include <string.h>
# include <iostream>
using namespace std;

class Cstring
{
private:
    char *str;
public:
    Cstring()
    {
        str = new char[10];
        if(str)
            strcpy(str, "Hello");
    }
    Cstring(char *p)
    {
        str = new char[strlen(p)+1];
        if(str)
            strcpy(str, p);
    }
    Cstring(const Cstring &cs)
    {
        str = new char[strlen(cs.str)+1];
        if(str)
            strcpy(str, cs.str);
    }
    Cstring operator +(const Cstring &cs)
    {
        Cstring temp;
        temp.str = new char[strlen(cs.str)+strlen(str)+1];/*申请空间为两个Cstring长度的和*/
        strcpy(temp.str, str);/*拷贝第一个操作数*/
        strcat(temp.str, cs.str);/*连接第二个操作数*/
        return temp;
    }
    void show()
    {
        cout<<str<<endl;
    }
    ~Cstring()
    {
        if(str)
            delete []str;
    }
};


int main()
{
    Cstring s1("is a wondful");
    s1.show();
    Cstring s2("programming  Language!");
    s2.show();
    Cstring s3;
    s3 = s1 + s2;
    s3.show();
    return 0;
}

作者: nuaazdh   发布时间: 2011-11-28

realloc的参数意义是(要扩展的指针,新的大小)

作者: woweiwokuang0000   发布时间: 2011-11-28

没细看:
在C++中混用
  new /realloc
  可能会有问题的

作者: keiy   发布时间: 2011-11-28

按你的改了下,供参考:
C/C++ code

# include <string.h>
# include <iostream>
using namespace std;

class Cstring
{
private:
    char *str;
public:
    Cstring()
    {
        str = new char[10];
        if(str)
            strcpy(str, "Hello");
    }
    Cstring(char *p)
    {
        str = new char[strlen(p)+1];
        if(str)
            strcpy(str, p);
    }
    Cstring(const Cstring &cs)
    {
        str = new char[strlen(cs.str)+1];
        if(str)
            strcpy(str, cs.str);
    }
    Cstring &operator +(const Cstring &cs)
    {
        char *temp;
        temp = new char[strlen(str)+strlen(cs.str)+1];
        strcpy(temp, str);
        strcat(temp, cs.str);
        delete []str;
        str=temp;
        return *this;
    }
    void show()
    {
        cout<<str<<endl;
    }
    ~Cstring()
    {
        delete []str;
    }
};


int main()
{
    Cstring s1("is a wondful");
    Cstring s2("programming  Language!");
    Cstring s3;
    s3 = s1 + s2;
    s3.show();
    system("pause");
    return 0;
}


作者: keiy   发布时间: 2011-11-28