#include<iostream.h>
#include<string.h>
class string
{
private:
char * str;
public:
string(char * s="")
{
str=new char[strlen(s)+1];
strcpy(str,s);
}
~string(){delete []str;}
void display()
{
cout<<str<<endl;
}
friend string operator +(string & s1,string & s2);
};string operator +(string & s1,string & s2)
{
string temp;
temp.str =new char[strlen(s1.str)+strlen(s2.str)+1];
strcpy(temp.str ,s1.str);
strcat(temp.str ,s2.str);
return(temp);
}
void main()
{
string s1("dddd");
string s2("dsfas");
string myname(operator +(s1,s2));
myname.display();
}

解决方案 »

  1.   

    return(temp);
    你返回了一个局部变量地址,再者,你对内存的处理不敢苟同
      

  2.   

    to 楼上,返回这个临时对象并不是出错的根源。
    string temp;创建的指针被释放了两次所以出错。所以,你必须实现深拷贝。
      

  3.   

    一次释放是析构temp时,一次释放是析构myname时
      

  4.   

    ~string(){delete []str;}改成~string()
      { 
         if(str) 
         {
           delete []str;
           str = NULL;
         }
      }
      

  5.   

    #include<iostream>
    #include<string>using namespace std;
    class myString
    {
    private:
    char * str;
    public:
    myString(char * s="")
    {
    str=new char[strlen(s)+1];
    strcpy(str,s);
    }
    myString(const myString & other)
    {
    str=new char[strlen(other.str)+1];
    memset(str,0,strlen(other.str)+1);
    strcpy(str,other.str);
    }
    ~myString(){delete []str;}
    void display()
    {
    cout<<str<<endl;
    }
    friend myString operator +(myString & s1,myString & s2);
    };myString operator +(myString & s1,myString & s2)
    {
    myString temp;
    delete [](temp.str);
    temp.str =new char[strlen(s1.str)+strlen(s2.str)+1];
    strcpy(temp.str ,s1.str);
    strcat(temp.str ,s2.str);
    return(temp);
    }
    void main()
    {
    myString s1("dddd");
    myString s2("dsfas");
    myString myname(operator +(s1,s2));
    myname.display();
    }
    在vs.net 2003下通过
      

  6.   

    temp不是会调用构造函数来new 吗?
      

  7.   

    你的错误:
    #include<iostream.h>
    #include<string.h>
    class string
    {
    private:
    char * str;
    public:
    string(char * s="")
    {
    str=new char[strlen(s)+1]; //------------(1)
    strcpy(str,s);
    }
    ~string(){delete []str;}
    void display()
    {
    cout<<str<<endl;
    }
    friend string operator +(string & s1,string & s2);
    };string operator +(string & s1,string & s2)
    {
    string temp;    //执行了(1),使得成员(temp.str)已经指向分配的内存
    temp.str =new char[strlen(s1.str)+strlen(s2.str)+1];//内存泄露,原因如下:
                                           //temp.str未释放就指向另一块分配的内存
    strcpy(temp.str ,s1.str);
    strcat(temp.str ,s2.str);
    return(temp);//temp拷贝给返回值后,调用析构函数(delete []str;)
                          //注意这里的拷贝只是简单的把temp.str的值赋给了返回值的成员str.
                          //也就是说当temp析构后,str指向的内存快也被delete了
    }
    void main()
    {
    string s1("dddd");
    string s2("dsfas");
    string myname(operator +(s1,s2));//这句执行后,myname.str指向的内存块已经被delete了;
    myname.display();
    }