Я перегружен 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;
}
программа вылетает с ошибкой:
*** Error in `./program': free(): invalid next size (fast): 0x0000000000cd20b0 *** Aborted
Если я не перегружать его, как это - не ошибка:
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;
}
'автоматического п = a.length(); a.reserve (n * b); while (b--) a.append (a, 0, n); return a; 'Должно быть лучше ... – Deduplicator
Действительно лучше :) – LogicStuff
С некоторыми' const' там, да –