2012-02-24 2 views
0

Когда я пытаюсь изменить размер списка, программа вылетает ... Посмотрите на этот код, попробуйте ввести 1,000,000,000 (10^9) ... На моих окнах 7 x64 doesnt Работа.Сбой списка C++ STL с номерами более 1 000 000 000

#include <cstdlib> 
#include <iostream> 
#include <list> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    list<long long> l; 

    long long n; 
    cin>>n; 

    cout<<l.max_size()<<endl; 

    //uncomment 1 or 2 

    //l.resize(n,l.size()+1); //1st try 

    /*for (long long i=0; i<n; i++) //2nd try 
     l.push_back(n);*/ 


    //system("PAUSE"); // uncomment if needed 
    return 0; 
} 

Максимального размер составляет более 4 * 10^9, но по-прежнему не работает ... Im использование новейшего MinGW (G ++)

+6

Как вы думаете, сколько памяти вы потребляете с помощью элементов списка 10^9? Даже если это простой список с двойной связью, у вас есть 2 указателя (2 x 8 байт) + значение (еще 8 байтов) (всего на элемент), что дает вам около 24 ГБ памяти. Также обратите внимание, что для реализаций может потребоваться больше, чем только этот размер 2x8Byte + вашего типа данных для каждого элемента. – Nobody

+6

'1000000000 * sizeof (long long)', вероятно, больше, чем количество байт ОЗУ вашего компьютера. Попробуйте [загрузить больше ОЗУ] (http://www.downloadmoreram.com/). –

+2

Почему он падает? Вы потеряли память? ОС не обязана [и на самом деле, она не позволяет] иметь 2^64 байта для вашей программы, даже для 64-битных систем – amit

ответ

12

Поскольку "доступная память" это немного непостоянная концепция, l.max_size() возвращается жесткий максимум. Ваш «крах», скорее всего, является неперехваченным std::bad_alloc, который вы ожидаете при нехватке памяти.

+0

Чтобы добавить к этому, в то время как процесс в современной операционной системе может иметь очень большое пространство виртуальной памяти, что не обязательно означает, что операционная система будет способствовать сумасшедшему распределению (и в этом случае ясно нет). – jstephenson

+0

@jstephenson: Верно, но это проблема для реализации на C++. Если я сделаю сумасшедший, но юридический запрос, он должен отрицать это. Это включает в себя перевод любой сумасшедшей ОС на «bad_alloc», – MSalters

+0

+9, один из upvotes - мой ^^ принимаю за 3 минуты –

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