Форум программистов, компьютерный форум 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, 19:10  [ТС]     Нужно выделить всю доступную процессу память блоками по 13 байт
DU, к сожалению, задача именно в прямом (не через классы или ещё чего) выделении памяти malloc'ом и heap'ом. Если malloc при недостаточной памяти возвращает NULL, то heap выбрасывает exception, который я не могу перехватить почему-то. Ставил и catch(...) и catch(std::bad_alloc&) - ничего..
Более того мне всё же не ясно, будет ли max-память процесса статической или она может измениться во время выделения?

Добавлено через 25 минут
Финальный код имеет вид :
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <vector>
#include <exception>
using namespace std;
 
#define MEM_BLOCK 17048
 
int main() 
{
    vector <char*> blocks;
    long long timeStart = GetTickCount64(), timeAllocation, timeRelease;
    char *newBlock = (char*)malloc(MEM_BLOCK);
    while (newBlock != NULL)
    {
        blocks.push_back(newBlock);
        newBlock = (char*)malloc(MEM_BLOCK);
    }
    
    char *lastBlock = NULL;
    int memoryUsage, lastBlockSize;
    for (int i = MEM_BLOCK-1; i>=0 && !lastBlock; --i)
    {
        lastBlock = (char*)malloc(i);
        lastBlockSize = i;
    }
    timeAllocation = (GetTickCount64()-timeStart)/1000;
    memoryUsage = blocks.size()*MEM_BLOCK+lastBlockSize;
    timeStart = GetTickCount64();
    for (unsigned int i=0; i<blocks.size(); ++i)
        free(blocks[i]);
    free(lastBlock);
    timeRelease = (GetTickCount64()-timeStart)/1000;
 
    printf("Method : Malloc\n");
    printf("Allocation time : %ld sec\n", timeAllocation);
    printf("Size : %ld bytes\n", memoryUsage);
    printf("Release time : %ld sec\n\n", timeRelease);
    blocks.clear();
    newBlock = lastBlock = NULL;
    
 
    HANDLE heap = HeapCreate(0, 0, 0); // Holy shit! It is 0x0000000-heap. Explode the brain, please
    //DWORD x = GetLastError(); // 8 - not enough memory
timeStart = GetTickCount64();
    newBlock = (char*)HeapAlloc(heap, HEAP_ZERO_MEMORY, MEM_BLOCK); // error with 0-heap
    while (newBlock != NULL)
    {
        blocks.push_back(newBlock);
        newBlock = (char*)HeapAlloc(heap, HEAP_ZERO_MEMORY, MEM_BLOCK);
    }
 
    for (int i = MEM_BLOCK-1; i>=0 && !lastBlock; --i)
    {
        lastBlock = (char*)HeapAlloc(heap, HEAP_ZERO_MEMORY, MEM_BLOCK);
        lastBlockSize = i;
    }
    timeAllocation = (GetTickCount64()-timeStart)/1000;
    memoryUsage = blocks.size()*MEM_BLOCK+lastBlockSize;
    timeStart = GetTickCount64();
    for (unsigned int i=0; i<blocks.size(); ++i)
        HeapFree(heap, 0, blocks[i]);
    HeapFree(heap, 0, lastBlock);
    timeRelease = (GetTickCount64()-timeStart)/1000;
 
    printf("Method : HeapAlloc\n");
    printf("Allocation time : %ld sec\n", timeAllocation);
    printf("Size : %ld bytes\n", memoryUsage);
    printf("Release time : %ld sec\n\n", timeRelease);
    blocks.clear();
    newBlock = lastBlock = NULL;
 
    _getch();
    return 0;
}
Ошибка там, где комментарий. Дело в том, что HeapCreate возвращает ошибку №8 - недостаточно памяти для команды. Но почему? Я ведь сделал free для всех блоков. Да даже если и не для всех, то хотя бы 1 кб свободный да остался бы после free. (Диспетчер показывает, что память занимает только сам MS visual studio, а значит хоть что-то да освободилось)

Добавлено через 1 час 59 минут
Идей совсем нет? ; (

Добавлено через 55 минут
И ещё. Такой подход не выделяет абсолютно всю память, которая есть физически. Остается порядка 10% (400 мб), а выделенная память всегда равна примерно ~2.2гб

Добавлено через 4 часа 12 минут
up-to-date
Если я плохо выразил вопрос, и он не понятен, то напишите, я попробую переформулировать или ещё чего ; (
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru