断言“str”失败

居鲁士

我是 C++ 的新蜜蜂。当我覆盖 operator+ 时出现跟随错误。

ConsoleApplication1.out: /root/projects/ConsoleApplication1/sdstring.cpp:43: static sdstring::size_t sdstring::strlen(const char*): 断言 `str' 失败。

这是我的测试代码!

    sdstring sd1(NULL);
    cout << "sd1:" << sd1 << endl;
    sdstring sd2("sd2");
    cout << "sd2:" << sd2 << endl;
    sdstring sd3;
    cin >> sd3;
    cout << "sd3:" << sd3 << endl;

    sd3 +=sd2 ;
    cout << "sd3:" << sd3 << endl;
    sdstring sd4 =sd3+sd1;
    cout << "sd4:" << sd2 << endl;
    sd1 = sd2 + sd1;
    cout << "sd1:" << sd1 << endl;
    cout << "sd3==sd2:" << (sd3 == sd2)<<endl;

此行中发生错误。

sdstring sd4 =sd3+sd1;

这是我的 sdstring.cpp 文件。

#include "sdstring.h"
#include <assert.h>



sdstring::sdstring(const char *str) {
    if (!str) {
        datas = new char[1];
        datas[0] = '\0';
    }
    else {
        datas = new char[strlen(str)+1];
        strcpy(datas, str);
    }
}
sdstring::sdstring(const sdstring& str) {
    datas = new char[strlen(str.datas) + 1];
    strcpy(datas, str.datas);
}
sdstring& sdstring::operator+(const sdstring& str)const {
    sdstring result(NULL);
    size_t total_size = getlen() + str.getlen();
    result.datas = new char[total_size + 1];
    strcpy(result.datas, datas);
    strcat(result.datas, str.datas);
    return result;
}

bool sdstring::operator==(const sdstring& str)const {
    return strcmp(datas, str.datas) == 0;
}
sdstring& sdstring::operator=(const sdstring& str) {
    if (this == &str)
        return *this;
    delete[] datas;
    datas = new char[str.getlen() + 1];
    strcpy(datas, str.datas);
    return *this;
}


sdstring::size_t sdstring::strlen(const char* str) {
    assert(str);
    size_t len = 0;
    while ('\0' !=  *str++)
        len++;
    return len;
}
char* sdstring::strcpy( char* des, const char* src){
    assert(des&& src);
    char* temp = des;
    while ('\0' != (*des++ = *src++));
    return temp;
}
int sdstring::strcmp(const char* fir, const char* sec) {
    assert(fir  && sec);
    while (*fir == *sec)
    {
        if (*fir == '\0') {
            return 0;
        }
        ++fir;
        ++sec;
    }
    return *fir - *sec;
}

char* sdstring::strcat(char* des,const char* src) {
    char* temp = des;
    while ('\0' != *des)
    {
        des++;
    }
    while ('\0' != (*des++ = *src++));
    return temp;
}

sdstring::~sdstring()
{
    if (datas)
    {
        delete[] datas;
        datas = nullptr;
    }
}
char& sdstring::operator[](const unsigned int position)const
{
    return position < getlen() ? datas[position] : datas[position-1];
}
sdstring& sdstring::operator+=(const sdstring& str)
{
    size_t total_size = getlen() + str.getlen();
    if (total_size != getlen()) {
        char* temp = datas;
        datas = new char[total_size + 1];
        strcpy(datas,temp);
        strcat(datas, str.datas);
        delete[] temp;
    }
    return *this;
}
ostream& operator<<(ostream& os, const sdstring& str)
{
    os << str.datas;
    return os;
}
 istream& operator>>(istream& is, sdstring& str)
{
     char* cache = new char[1024];
     is >> cache;
     delete[]str.datas;
     str.datas = new char[sdstring::strlen(cache)];
     sdstring::strcpy(str.datas, cache);
     delete[]cache;
     return is;
}

谁能帮帮我,先谢谢了!

保罗·麦肯齐

您的代码有几处错误。然而,operator +错误在于它返回对局部变量的引用,这是未定义的行为。

sdstring& sdstring::operator+(const sdstring& str)const 
{
    sdstring result(NULL);
    //..
    return result;  // Undefined behavior.
}

operator + 应该返回一个全新的对象,而不是对对象的引用。

sdstring sdstring::operator+(const sdstring& str)const // <-- Note the return value is sdstring
{
    sdstring result(NULL);
    //..
    return result;  
}

您的代码的其他问题:

1)在调用为新字符串分配内存之前operator=销毁内存使用如果抛出异常,则对象将被破坏,因为数据已被破坏,并且您无法返回并使用旧数据重置字符串。使用复制/交换习语来防止这种情况发生delete[] datas;new[]new[]sdstring

2)你应该将字符串的长度存储在一个成员变量中,而不是strlen每次你想知道字符串的长度时都调用strlen的速度很慢,因为它必须循环计算每个字符以确定终止 '\0' 字符的位置。取而代之的是,只需存储一次字符串的长度并继续使用该值。

3)不要编写自己的strlenstrcmp函数,而是使用库函数strlenstrcmp. 与库版本不同,您的版本未优化。

4)operator +可以写成operator +=. operator +应该非常简单地写成:

sdstring sdstring::operator + (const sdstring& rhs)
{
   return sdstring(*this) += rhs;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章