C++动态内存分配问题,不知道问题出在了哪里?

老是留了个作业,设计一个CString类,可以和字符数组兼容使用,我的代码如下:
头文件cstring1.h内容:
#ifndef _CSTRING1_H
#define _CSTRING1_H

#include
using namespace std;

class Cstring1
{
private:
char* str;
int size;
public:
//Cstring1();
Cstring1(char s=""); // why=""
Cstring1(const Cstring1 &s);
int length(void) const;
Cstring1& SubStr(int pos, int length);
Cstring1& operator=(const Cstring1& s);//Cstring1& operator=(const Cstring1& s)const;这个语句不对
Cstring1& operator=(char*s);
int operator == (const Cstring1& s)const;
int operator == (char*s)const;
friend int equals(char
s1, const Cstring1& s);//注意这里的s1 是否要加const修饰

~Cstring1(void);

};

Cstring1::Cstring1(char *s)
{
size=strlen(s)+1;
str=new char[size];
strcpy_s(str,size,s);
}

Cstring1::~Cstring1(void)
{
delete []str;
}

Cstring1::Cstring1(const Cstring1 &s)
{
size=s.size;
str=new char[size];
if(str==NULL) exit(0);
//strcpy(str,s.str);
for(int i=0;i<size;i++)
str[i]=s.str[i];
}

int Cstring1::length() const
{
//return strlen(str);
return size;
}

Cstring1& Cstring1::SubStr(int pos, int length)
{
int charsLeft=size-pos-1;
Cstring1 temp;
char*p,*q;
if(length>charsLeft)
length=charsLeft;
delete []temp.str;
temp.str=new char[length+1];
p=temp.str;
q=&str[pos];
for(int i=0;i<length;i++)
*p++=*q++;
*p=NULL;
temp.size=length+1;
return temp;
}

Cstring1& Cstring1::operator= (char *s)
{
int length=strlen(s);
if(size!=length)
{
delete[]str;
str=new char[length+1];
size=length+1;
}
strcpy_s(str,size,s);
return *this;

}

Cstring1& Cstring1::operator=(const Cstring1 &s)
{

if(size!=s.size)
{
    delete []str;
    str=new char[s.size];
    size=s.size;
}
for(int i=0;i<size;i++)
    str[i]=s.str[i];
return *this;

}

int Cstring1::operator ==(char *s) const
{
return (strcmp(str,s)==0);
}

int Cstring1::operator ==(const Cstring1 &s) const
{
return (strcmp(str,s.str)==0);
}

int equals(char* s1, const Cstring1& s)//注意这里的s1 是否要加const修饰
{
return (strcmp(s.str, s1)==0);
}

#endif

以下是主程序内容:
#include "Cstring1.h"
void main()
{
Cstring1 str1("hello,C++");
Cstring1 str2("hello");
Cstring1 str3, str4, str5;
cout<<"计算str1的长度:"<<str1.length()<<endl;

str3 = str1.SubStr(5,9);
str4 = str1.SubStr(5,9);

str5="hello";

if(str3==str4)
    cout<<"Cstring1和Cstring1串比较,相等"<<endl;
if(str5=="hello")
    cout<<"Cstring1和字符数组的字符串比较,相等"<<endl;
if(equals("hello", str2))
    cout<<"字符数组的字符串和Cstring1比较,相等"<<endl;

}

编译可以通过,一运行老是出来一个bad_alloc错误,请大家帮个忙看看,我会给加分的

 Cstring1& Cstring1::SubStr(int pos, int length)
{
    int charsLeft=size-pos-1;
    Cstring1 temp;
    char*p,*q;
    if(length>charsLeft)
        length=charsLeft;
    delete []temp.str;
    temp.str=new char[length+1];
    p=temp.str;
    q=&str[pos];
    for(int i=0;i<length;i++)
        *p++=*q++;
    *p=NULL;
    temp.size=length+1;
    return temp;
}
``

这个函数有问题,它返回了堆栈上变量的地址,但是堆栈上的变量是会被销毁的。`