Форум программистов, компьютерный форум CyberForum.ru

Нужно выделить всю доступную процессу память блоками по 13 байт - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Числа Фибоначчи http://www.cyberforum.ru/cpp-beginners/thread662667.html
Вводится натуральное число F. Найти число n, для которого значение n-ого числа Фибоначчи является ближайшим числу F, но не больше его. Желательно не использовать в программе математические формулы и принимать за первый член ряда Фибоначчи F1=1.
C++ Массив: Определите, в котором часу была впервые отмечена отрицательная температура. Просьба помоч с решением задач: 1)С 8 до 20 часов температура воздуха измерялась ежечасно. Известно, что в течение этого времени температура понижалась. Определите, в котором часу была впервые отмечена отрицательная температура. 2)Дан массив A(a1,a2,...,a50). Найти произведение всех элементов, значения которых меньше 50, и сложить его с произведением элементов больших 100. Заранее благодарен. http://www.cyberforum.ru/cpp-beginners/thread662666.html
Многомерный массив (матрица) на С++ C++
Матрица K(m,m) состоит из нулей и единиц. Найти в ней номера строк и столбцов, не содержащих единицы, либо сообщить, что таких нет.
Массив: Вывести отрицательные элементы на экран в обратном порядке. C++
Дан одномерный массив, состоящий из N вещественных элементов. 1.Ввести массив с клавиатуры. 2.Найти максимальный элемент. 3.Вычислить сумму четных элементов массива. 4.Вывести отрицательные элементы на экран в обратном порядке. 5.Отсортировать массив методом вставки и вывести отсортированный массив на экран.
C++ Массив: Сколько раз пользователь ввел то или иное число? http://www.cyberforum.ru/cpp-beginners/thread662650.html
Пользователь вводит количество чисел n, а потом вводит сами числа. Каждое из них от 1 до 10 гарантировано. Сколько раз он ввел то или иное число? и да, подскажите, не в тему конечно но, как сделать заголовок, жирным шрифтом, как у всех?
C++ Структура: Определить, имеется ли книга с названием "Информатика". Сведения о книге - это фамилия автора, название и год издания. Определить, имеется ли книга с названием "Информатика". Если да, то сообщить фамилию автора и год издания. Данные ввести с клавиатуры, проинициализировать. Вывести рез-т работы пограммы на экран и в файл. подробнее

Показать сообщение отдельно
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
03.10.2012, 10:51     Нужно выделить всю доступную процессу память блоками по 13 байт
Нужно выделить всю доступную процессу память блоками по 13 байт.
Использовать нужно две функции :
malloc
HeapAlloc
При этом нужно потом посчитать количество памяти (не при выделении) и освободить её.

Как это вообще сделать? Завести вектор, где каждый элемент будет хранить указатель на 13 байт, а затем выделять каждому новому элементу блок памяти, пока malloc/HeapAlloc не закричит об ошибке? Но тогда есть шанс, что у процесса не использовано 0-12 байт памяти. Как поступать в этом случае? При ошибке пройтись от 12 до 1 и выделять последовательно на "добив"?
Более того, является ли "максимально доступная процессу память" статическим числом? Т.е, есть ли шанс, что, когда я выделил память по 13 блоков и в конце остался блок 5 байт, я начинаю идти по циклу 12->1 на "добив", но в этот момент *ХОП* и у процесса можно выделить ещё 15мб?..

Всё, что есть у меня :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <vector>
using std::vector;
 
#define MEM_BLOCK 13
 
int main() 
{
    HANDLE heap = HeapCreate(0, 0, 0); // GetProcessHeap(); не знаю, что из двух использовать
    char *var = (char*)HeapAlloc(heap, HEAP_ZERO_MEMORY, MEM_BLOCK);
    vector <char*> memory;
    while (var != NULL)
    {
        memory.push_back(var);
        var = (char*)HeapAlloc(heap, HEAP_ZERO_MEMORY, MEM_BLOCK);
    }
 
    int lastMemCapacity;
    char *lastMem;
    for (int i = MEM_BLOCK-1; i>=1; ++i)
    {
        lastMem = (char*)HeapAlloc(heap, HEAP_ZERO_MEMORY, MEM_BLOCK);
        if (lastMem != NULL)
        {
            lastMemCapacity = i;
            break;
        }
    }
 
    printf("Size : %I64d\n", __int64(memory.size())*MEM_BLOCK+lastMemCapacity);
 
    /*for (unsigned int i=0; i<memory.size(); ++i)
        free(memory[i]);
    free(lastMem); // For Malloc */
 
    _getch();
    return 0;
}
Но в данном случае выкидывает исключение ещё при первом выделении памяти - что странно, ведь (как написано на msdn.. либо как я понял) heapalloc должна давать NULL, если не хватает памяти, а не выбрасывать exception. Я ведь не давал на то согласие в параметрах.

p.s Или можно забить на vector, выделяя память в указатель var каждый новый раз и забывая указатель на предыдущий блок? В конце просто дать heapsize и heapfree? Не будет потерь? Более того, heapsize требует указатель на начало выделенной памяти. А у меня этих указателей over 9000 :<

Добавлено через 11 минут
Проверочка вида :
C++
1
2
3
4
5
6
7
8
try
{
    var = (char*)HeapAlloc(heap, HEAP_ZERO_MEMORY, MEM_BLOCK);
}
catch (...)
{
    break;
}
Почему-то не катит :<
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 05:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru