Почему происходит свободная ошибка при перегрузке оператора?

Я перегружен 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<a.length()*b; i++)
a[i]=a[i%old_length];
return a;
}

программа вылетает с ошибкой:

*** Ошибка в `./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<a.length()*b; i++)
a2[i]=a[i%old_length];
return a2;
}

Так в чем же проблема? Есть ли способ не создавать новую строку a2? Это потребляет дополнительную память.

#include <iostream>
#include <string>

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;
}

1

Решение

Вы не можете повторить, пока 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 переменная (не так эффективна с точки зрения производительности, лучший подход см. в комментарии ниже).

5

Другие решения

Как только вы делаете a.resize(a.length()*b);

a.length() изменился

Ваша петля должна быть чем

for(unsigned i = old_length ;i<a.length(); i++)
3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector