Небольшое несоответствие

Всем доброго времени суток.
Имеется код:

#include <iostream>

using namespace std;

int main() 
{
    for ( unsigned long long i = 0; ;i++ )
    {
        try
        {
            new int[1000];
        }
        catch ( bad_alloc )
        {
            break;
        }
    }   
    cout << "Выделено: " << sizeof ( int ) * 1000 * i << " байт." << endl;
    cin.ignore();
    cin.get();
    return 0;
}

Думаю понять, что он делает не сложно( он тупо выделяет память ).
Но интересно не это. Интересен вывод, вот что программа выводит:

Выделено: 3208660000 байт.

Это почти 3Гб.
Но системный монитор( в windows читай Деспетчер задач ) показывает, что программа съедает 1.5Гб.
И вся эта ересь на фоне того, что на моём ноутбуке всего 2Гб оперативки.
Почему появляется такое несоотвествие? Не замешан ли тут файл подкачки?

Проверь, что у тебя лежит в i, когда выводится ответ.
Ты определяешь i в блоке цикла, по окончание итераций область видимости для i должна заканчиваться.

selevit, насколько я помню, есть стандарт С++, при котором переменные, объявленные в блоке цикла, видимы и после него, тут как раз этот случай.

Но всё равно, попытался определить переменную i перед циклом, результат тот же, значение i: 801898

По поводу стандарта хз. Но.

c++ alloc.cc

Вывод GCC 4.7.1:

alloc.cc: In function ‘int main()’:
alloc.cc:18:61: error: name lookup of ‘i’ changed for ISO ‘for’ scoping [-fpermissive]
alloc.cc:18:61: note: (if you use ‘-fpermissive’ G++ will accept your code)

В любом случае, после того, как память закончится, ОС будет использовать дисковый своп, если последний доступен.

Да, дело, скорее всего, в файле подкачки.

Я думаю, porshe, ты не прав :)
Если ты скомпилируешь этот код, то ты сам все увидишь.

#include <iostream>

using namespace std;

int main()
{
    int i = 5;    // это - первая переменная i
    for (int i = 5; i < 7; i++){    // а это - вторая i (в конце цикла i == 6)    
        if (6 == i){
            i += 10; // i == 16 (2-я i)
            int i = 15; // а это - третья i и ни 1-я ни 2-я i здесь не видны
            cout << "the third i = " << i << '\n';  // 3-я i == 15
            int j = 20;
            cout << "j = " << j << '\n';
        }
        if (16 == i) // и если поставить условие i == 6, то оно не сработает т.к. i == 16;
            cout << "the second i = " << i << '\n';
        // cout << j << '\n';   // здесь j уже не видна
    }
    // cout << j << '\n';   // и здесь тоже
    cout << "the first i = " << i << '\n';    // i == 5 (1-я i)
    return 0;
}

То есть, переменная объявленная внутри блока, видна только внутри этого блока. По этой причине у меня VS2010 не компилирует твой код.

selevit, насколько я помню, есть стандарт С++, при котором переменные, объявленные в блоке цикла, видимы и после него, тут как раз этот случай.

Вот такой вот стандарт С++ :)

И по поводу твоего кода (в такой редакции)

#include <iostream>

using namespace std;

int main() 
{
    setlocale(0, "");
    unsigned long long i;
    for (i = 0; ; i++)
    {
        try
        {
            new int[1000];
        }
        catch (bad_alloc)
        {
            break;
        }
    }   
    cout << "Выделено: " << sizeof ( int ) * 1000 * i << " байт." << endl;
    cin.ignore();
    cin.get();
    return 0;
}

моя система (ОЗУ 4 Гб) выдает такой результат

Выделено: 2033336000 байт.

при этом системный монитор «говорит» о том, что программа Temp.exe «съела» 2070580 КБ, то есть все ОК.

alf, так или иначе, но этот код( где переменная объявлена в цикле ) у меня компилируется.

Вот, что по этому поводу пишет Шилдт( Герберт Шилдт — Полный справочник по С++. 2006 ):

Утверждение, что переменная объявленная внутри цикла for является локальной, в некоторых компиляторах не выполняется. В старых компиляторах такие переменные были доступны и вне оператора for. Однако стандарт C++ ограничил область видимости телом оператора for

Видимо в ubuntu 14 используется старый компилятор. Ради интереса в Virtual Box'е( windows 7, devcpp 5.4.2 ) попытался прогнать этот код, вот результат:

[Error] name lookup of 'i' changed for ISO 'for' scoping [-fpermissive]
[Note] (if you use '-fpermissive' G++ will accept your code)

Что и следовало ожидать.

Впрочем, видимо, я поторопился и ляпнул про какой-то там стандарт. Нет такого, каюсь.

Вероятно, в твоей убунте опция -fpermissive включена по умолчанию.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.