这段代码哪里出错了呢,我觉得没错误啊



```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:

  1. 在 hstring(const char* _str) 构造函数中,为 c_str 分配内存时,应该使用 new char[len] 而不是 new char(len),前者可以分配 len 个 char 的空间,而后者只能分配一个 char 的空间,导致后面的内存操作越界。
  2. 在使用 hstring(str.show()) 构造 hstring 对象时,由于 show() 返回的是 const char* 类型,所以需要在构造函数前加上 const 修饰符,即 hstring(const char* const _str)。
    下面是修改后的代码:
#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指针指向空间释放了,所以第二个释放会报错的