当前位置:  开发笔记 > 编程语言 > 正文

为什么运算符重载会发生自由错误?

如何解决《为什么运算符重载会发生自由错误?》经验,为你挑选了1个好方法。

我重载operator*std::string类,但在这种情况下:

std::string operator*(std::string a, unsigned b) //bad
{
    unsigned old_length = a.length();
    a.resize(a.length()*b);
    for(unsigned i = old_length ;i

程序崩溃并出现错误:

***"./ program"中的错误:free():下一个大小无效(快):0x0000000000cd20b0***已中止

如果我像这样重载它 - 没有错误:

std::string operator*(std::string a, unsigned b)
{
    unsigned old_length = a.length();
    std::string a2 = a;
    a2.resize(a.length()*b);
    for(unsigned i = 0 ;i

那问题出在哪里?有没有办法不创建新的字符串a2?它消耗额外的内存.

#include 
#include 

std::string operator*(unsigned b, std::string a)
{
    return operator*(a, b);
}

int main(int argc, char **argv)
{
    std::string a = "abcdef "; // if string contains more than 4 symbols - free error for the first case
    std::string aaaa = 4*a;

    std::cout << a << "\n" 
              << aaaa << "\n" 
              << std::endl;
    return 0;
}

LogicStuff.. 5

你不能a.length() * b再次迭代(因为它相当于old_length * b * b调整大小后).

条件必须是i < a.length()i < old_length * b.

但为什么不使用一些std::string功能呢?

std::string operator*(std::string a, unsigned b)
{
    a.reserve(a.length() * b);

    for(unsigned i = 1 ; i <= b; i++)
        a += a.substr(0, a.length() / b);

    return a;
}

我们还有效地消除了old_length变量(在性能方面不那么有效,请参阅下面的评论中更好的方法).



1> LogicStuff..:

你不能a.length() * b再次迭代(因为它相当于old_length * b * b调整大小后).

条件必须是i < a.length()i < old_length * b.

但为什么不使用一些std::string功能呢?

std::string operator*(std::string a, unsigned b)
{
    a.reserve(a.length() * b);

    for(unsigned i = 1 ; i <= b; i++)
        a += a.substr(0, a.length() / b);

    return a;
}

我们还有效地消除了old_length变量(在性能方面不那么有效,请参阅下面的评论中更好的方法).


`auto n = a.length(); a.reserve(n*b); while(b--)a.append(a,0,n);返回a;`应该更好......
推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有