重新初始化字符串对象时发生崩溃
crash happens while re-initializing a string object
请您深入了解下面提供的字符串类程序
class String{
private: int len;
int size;
char *p;
public:
int getlen()
{
return len;
}
int getsize()
{
return size;
}
char* getp()
{
return p;
}
String(char *p1=0)
{
cout<<"constructor called"<<endl;
if(p1!=0)
{
len=strlen(p1);
size=len+1;
p=new char(sizeof(char)*(size));
strncpy(p,p1,size);
}
else
{
len=size=0;
p="";
}
}
String(String &s1)
{
cout<<"copy constructor called"<<endl;
if(&s1!=this)
{
cout<<"copy constructor called"<<endl;
len=s1.getlen();
size=len+1;
p=new char(sizeof(char)*(size));
//char *d=s1.getp();
strncpy(p,s1.getp(),size);
}
}
void display()
{
cout<<"string len="<<len<<endl;
cout<<"string size="<<size<<endl;
cout<<"string name="<<p<<endl;
}
~String()
{
cout<<"destructor called"<<endl;
if(strlen(p) >= 1)
{
cout<<"111"<<endl;
delete []p;
}
//cout<<"destructor finished"<<endl;
}
};
int main(int argc, char *argv[])
{
String s1;
String s2("hello");
s1.display();
s2.display();
s2=String("Hello World");
s2.display();
return 0;
}
请查看重新初始化行
s2=String("Hello World");
String("Hello World")将创建一个临时的字符串对象,它应该调用赋值运算符。由于编译器的默认赋值运算符将执行浅拷贝,因此在临时 String 对象超出范围后,String 类中存在的 char 指针将变为 NULL。
我试图重载赋值运算符,如下所示
String& operator =(String &s1)
{
cout<<"operator = called"<<endl;
if(&s1!=this)
{
len=s1.len;
size=s1.size;
if(strlen(p)>=1)
delete p;
p=new char(sizeof(char)*size);
strncpy(p,s1.getp(),size);
}
return *this;
}
但它给出的错误与"运算符="不匹配(操作数类型为"字符串"和"字符串") s2=字符串("世界");
要求您在更正"operator="后编译程序,因为我怀疑复制构造函数可能会给出任何错误。
提前谢谢..
一个问题是这一行:
p=new char(sizeof(char)*(size));
您需要改用方括号:
p=new char[sizeof(char)*(size)];
^ ^
其次,对于复制构造函数和赋值运算符,参数类型应该是 const
限定引用,也称为 const String&
,而不仅仅是 String&
。此外,作为良好做法,任何不修改任何成员变量(如 display
或 getp
)的方法都应该在函数声明的末尾(即在{
之前)有一个const
。
相关文章:
- 类对象数组的问题会导致崩溃
- 在虚幻引擎中删除NXOpen对象时崩溃
- 将方法转换为调用该方法的成员函子对象会导致崩溃
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- C 回调函数在对象 pascal 上崩溃
- 在 C++ 中,类实例对象 do memcpy 总是崩溃
- 具有重载类型转换运算符的函数对象崩溃
- 当删除上下文属性中的QLIST对象时,QT QML应用程序崩溃
- 全局范围内的对象会导致程序退出时崩溃
- 我的视频流程在运行darknet.exe以进行检测对象时崩溃了
- 为什么通过引用传递从 std::function 派生的对象会使程序崩溃?
- 使用指针的矢量矩阵在对象上调用析构函数时程序崩溃
- 使用全局对象时崩溃,但使用本地对象时不会崩溃
- QT应用程序声明新对象后崩溃
- 将对象指针的push_back崩溃到std :: vector中
- 将对象写入文件时应用程序崩溃
- 创建对象数组c++时崩溃
- 在小对象优化中调试崩溃以进行类型擦除
- 为什么将对象从一个智能指针移至另一个原因崩溃
- C++:指向对象的指针数组 - 删除元素时程序崩溃>