```c++
#include
#include
using std::string;
class hstring
{
private:
char* c_str;
unsigned short len;
unsigned short length(const char* str)
{
unsigned short len{};
while (str[len++]);
return len;
}
public:
hstring( )
{
len = 1;
c_str = new char[1]{0};
}
hstring(const hstring& str) :hstring(str.show())
{
}
hstring(const char* _str)
{
len = length(_str);
c_str=new char(len);
memcpy(c_str, _str, len);
}
char* show() const
{
return c_str;
}
~hstring()
{
delete[] c_str;
}
};
int main()
{
hstring str("1");
hstring strA(str);
std::cout << str.show();
system("pause");
}
```、
这段代码哪里出错了呢
以下回答结合了ChatGPT:
#include<iostream>
#include<string>
#include<cstring>
using std::string;
class hstring
{
private:
char* c_str;
unsigned short len;
unsigned short length(const char* str)
{
unsigned short len{};
while (str[len++]);
return len;
}
public:
hstring()
{
len = 1;
c_str = new char[1]{ 0 };
}
hstring(const hstring& str) :hstring(str.show())
{
}
hstring(const char* const _str)
{
len = length(_str);
c_str = new char[len];
memcpy(c_str, _str, len);
}
char* show() const
{
return c_str;
}
~hstring()
{
delete[] c_str;
}
};
int main()
{
hstring str("1");
hstring strA(str);
std::cout << str.show();
system("pause");
}
unsigned short len = 0;
c_str=new char[len];
还有,你已经有一个成员变量len了,这里不建议你再用len,换一个名字
hstring strA(str); 这个拷贝构造函数有问题,对c_str指针只是进行了浅拷贝,也就是两个类对象共享了一块地址空间,那么在析构时,由于释放了指针,导致第二个对象释放时,由于前一个已经将c_str指针指向空间释放了,所以第二个释放会报错的。因此拷贝构造函数对c_str指针也要进行深拷贝,与有参构造函数一样的做法
hstring strA(str); 这个拷贝构造函数有问题,对c_str指针只是进行了浅拷贝,也就是两个类对象共享了一块地址空间,那么在析构时,由于释放了指针,导致第二个对象释放时,由于前一个已经将c_str指针指向空间释放了,所以第二个释放会报错的