0

我正在尝试重载加号以连接两个字符串,但我不断收到错误消息。

VS 2010 给出了一个断言失败消息:“Expression: (L "Buffer is too small" && 0)" ; 文件: f:\dd\vctools\crt_bld\self_x86\crt\src\tcscat_s.inl;行: 42 。

您认为我的代码有什么问题?

#include "stdafx.h"

class MyString{
    int l;  // the length of the array pointed by buf
    char *buf; //pointer to a char array
public:
        ...
    MyString(char *);
    friend MyString operator+(MyString &,MyString &);
        ...
};

MyString::MyString(char *p)
{
    buf=new char[strlen(p)+1];
    strcpy_s(buf,strlen(p)+1,p);
    l=strlen(p)+1;
}

MyString operator+(const MyString &a,const MyString &b)
{
    MyString result("");
    result.l=a.l+b.l;
    delete[] result.buf;
    result.buf=new char[result.l+1];
    result.buf[0]='\0';
    strcat_s(result.buf,result.l+1,a.buf);
    strcat_s(result.buf,result.l+1,b.buf);
    return result;
}

int _tmain(int argc, _TCHAR* argv[])
{
    MyString a("hello"),b("world"),c("");
    c=a+b;
    system("pause");
    return 0;
}

现在可以了!谢谢大家!

4

3 回答 3

2
strcat_s(result->buf,strlen(a.buf),a.buf);
strcat_s(result->buf,strlen(b.buf),b.buf);

的第二个参数strcat_s是目标缓冲区的大小,而不是应附加的字符串的大小。所以你需要把它改成

strcat_s(result->buf,result->l+1,a.buf);
strcat_s(result->buf,result->l+1,b.buf);

正如其他人已经指出的那样,其余的 operator + 实现也被破坏了。新建一个实例然后按值返回它是无稽之谈。只需在堆栈上实例化结果并按值返回。

于 2012-10-25T00:32:21.530 回答
1

应该是result.buf=new char[result.l+1];允许空字符。

于 2012-10-24T23:24:19.810 回答
1

在 operator+ 中,变量“MyString result”在堆栈上声明,随后通过引用返回,这很糟糕。

然后编辑了OP。变量“result”不再在堆栈上声明,而是在堆上分配。但是,随后发生了内存泄漏。

这里正确的做法是按值返回并在堆栈上声明“MyString 结果”。还要确保你有一个复制构造函数。还有一个析构函数。

您还应该让您的构造函数采用“const char*”。

于 2012-10-24T23:27:07.710 回答