2017-02-08 5 views
0

Когда я запускаю этот код, я получаю сообщение об ошибке, как это:Почему при запуске этого кода я получаю исключение std :: bad_alloc?

Terminate вызывается после метания экземпляра 'станд :: bad_alloc'
какой(): станд :: bad_alloc

Этом приложение попросило Runtime прекратить его в необычном способе . Обратитесь в службу поддержки приложения за дополнительной информацией .

Я думаю, это может быть вызвано линией «resize()», но я не знаю, как ее исправить. Вот мой код:

#include <cstdio> 
#include <string> 
#include <iostream> 
using namespace std; 

long long n, l, r; 
string x[3]; 

int main() 
{ 
    ios::sync_with_stdio(false); 
    for (int i = 0; i <= 2; i++) 
     x[i].resize(x[i].max_size()); 
    x[0] = '0'; 
    x[1] = '1'; 
    cin >> n >> l >> r; 
    for (register long long i = 2; i <= n ; i++) 
     x[i % 3] = x[(i - 2) % 3] + x[(i - 1) % 3]; 
    cout << x[n % 3].substr(l, r - l + 1) << endl; 
    return 0; 
} 
+2

Не изменяйте размер вашей строки настолько большой. Вы пытались распечатать размер, который вы пытаетесь изменить? –

+2

Вам вообще не нужно изменять их размер. 'c = a + b' автоматически выделяет достаточное количество хранилища в' c'. – aschepler

+0

Да, это 2147483647 – godwings

ответ

0

std::string::max_size(), вероятно, будет большое число таких как SIZE_MAX, например, 4 ГБ на 32-битной системе или квадрат этого в 64-битных системах. Таким образом, ваша программа исчерпала память.

Ваша программа даже не нуждается в этом распределении, так как вы сразу же перезаписываете первые 2 строки односимвольной строкой! Возможно, вы думали о reserve вместо resize, но даже тогда вы могли зарезервировать гораздо меньшее количество, чем max_size.

NB. register устарел и будет удален на C++ 17.

 Смежные вопросы

  • Нет связанных вопросов^_^