9 / 9 / 1
Регистрация: 03.04.2016
Сообщений: 450
1

Аллокатор malloc, как избавиться от CRT

23.01.2018, 22:50. Показов 1282. Ответов 9
Метки нет (Все метки)

Вот рабочий код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    HANDLE hFile = CreateFile("temp.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
 
        cout << "Error CreateFile" << endl;
    }
 
    DWORD dwSize = GetFileSize(hFile, 0);
    DWORD dwBytesRead;
    LPBYTE pBuffer = (LPBYTE)malloc(dwSize);
 
    //LPBYTE pBuffer = (LPBYTE)VirtualAlloc(NULL, sizeof (dwSize), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
 
    if (ReadFile(hFile, pBuffer, dwSize, &dwBytesRead, 0) == NULL)
    {
        cout << "Error ReadFile" << endl;
    }
Работает. Пытаюсь на чистом WinAPI выделить память VirtualAlloc
C++
1
LPBYTE pBuffer = (LPBYTE)VirtualAlloc(NULL, sizeof (dwSize), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
Получаю ошибку Error ReadFile, ребята кто знает помогите!!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.01.2018, 22:50
Ответы с готовыми решениями:

Как написать пуловый аллокатор для работы с объектами
Здравствуйте! Подскажите как написать пуловый аллокатор для работы с объектами

В чем разница между malloc() и (char *)malloc()
Прошу помочь разобраться: не могу понять в чем разница междуs=malloc(sizeof(char)); иs=(char...

Пишем аллокатор
дабы не захламлять и так уже захламленную тему про перегрузку операторов создаю новую тему,...

Быстрый аллокатор
Собственно, необходим аллокатор для быстрого выделения памяти под мелкие объекты, совместимый со...

9
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
24.01.2018, 02:20 2
Цитата Сообщение от zombivadim Посмотреть сообщение
C++
1
LPBYTE pBuffer = (LPBYTE)VirtualAlloc(NULL, sizeof (dwSize), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
Это что?) sizeof (dwSize) = 4.
0
9 / 9 / 1
Регистрация: 03.04.2016
Сообщений: 450
24.01.2018, 10:18  [ТС] 3
Цитата Сообщение от lArtl Посмотреть сообщение
Это что?) sizeof (dwSize) = 4.
Я не понял о чем вы.
0
3360 / 1916 / 368
Регистрация: 09.09.2017
Сообщений: 7,820
24.01.2018, 11:06 4
о том что вы запрашиваете всего 4 байта памяти, а читаете, вероятно, больше
0
138 / 138 / 53
Регистрация: 14.06.2016
Сообщений: 467
24.01.2018, 11:55 5
Цитата Сообщение от zombivadim Посмотреть сообщение
Получаю ошибку Error ReadFile, ребята кто знает помогите!!
GetLastError() знает.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
о том что вы запрашиваете всего 4 байта памяти
запрашивает то 4 байта, а получит 4 килобайта. Но возможно даже этого мало, да. Но это всё гадание на кофейной гуще, надо же код ошибки смотреть.
0
3360 / 1916 / 368
Регистрация: 09.09.2017
Сообщений: 7,820
24.01.2018, 12:10 6
Цитата Сообщение от jr_ Посмотреть сообщение
запрашивает то 4 байта, а получит 4 килобайта
Запрашивает в смысле у ОС под хранение данных. Извиняюсь если недостаточно однозначно сформулировал.
Сколько ОС выделит действительно неизвестно, но рассчитывать надо на то что если функция отработала успешно (кстати, это почему-то не проверяется), то выделено именно 4 байта.
А размер файла мы не знаем, но вряд ли там всего 4 байта.
VirtualAlloc
Зачем эта функция вообще нужна не-системщикам когда есть переносимая malloc?
0
138 / 138 / 53
Регистрация: 14.06.2016
Сообщений: 467
24.01.2018, 12:17 7
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
то выделено именно 4 байта
VirtualAlloc выделяет постранично, поэтому всё таки не 4
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Зачем эта функция вообще нужна не-системщикам когда есть переносимая malloc?
бывают же нетривиальные задачи, у меня один раз такая была.
но врядли у автора что то подобное.
0
9 / 9 / 1
Регистрация: 03.04.2016
Сообщений: 450
24.01.2018, 18:52  [ТС] 8
Цитата Сообщение от jr_ Посмотреть сообщение
GetLastError() знает.
Я просто сократил код до максимума.
C++
1
if ((pBuffer) == NULL)
Не возвращает ошибки. Функция VirtualAlloc отрабатывает нормально. А вот ReadFile возвращает ошибку 998 - Неверная попытка доступа к адресу памяти.
Цитата Сообщение от jr_ Посмотреть сообщение
VirtualAlloc выделяет постранично, поэтому всё таки не 4
Насколько я понял в описании данной функции если запрашиваемый размер больше одной странички, то просто выделится больше страниц памяти.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Зачем эта функция вообще нужна не-системщикам когда есть переносимая malloc?
VirtualAlloc более гибкая и имеет больше возможностей по сравнению с malloc.
0
138 / 138 / 53
Регистрация: 14.06.2016
Сообщений: 467
24.01.2018, 18:56 9
Лучший ответ Сообщение было отмечено zombivadim как решение

Решение

Цитата Сообщение от zombivadim Посмотреть сообщение
998 - Неверная попытка доступа к адресу памяти
Ну всё верно. Где то в ядре происходит исключение при записи в буффер который ты указал, потому что его размер слишком мал, и происходит запись за его границы.
А всё от того, что должно быть так.
C++
1
LPBYTE pBuffer = (LPBYTE)VirtualAlloc(NULL, dwSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
1
9 / 9 / 1
Регистрация: 03.04.2016
Сообщений: 450
24.01.2018, 19:37  [ТС] 10
jr_, Спасибо! Я настолько привык везде использовать sizeof, что записал его по инерции.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.01.2018, 19:37

Аллокатор в chrome
Всем привет, начал изучать исходники хрома, в аллокаторе, метод realloc должен возвращать nullptr...

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

Аллокатор памяти общего назначения
Добрый день! В ВУЗе задали написать аллокатор памяти общего назначения на С++, но у меня нет ни...

Задача с собеседования (аллокатор памяти)
Вопрос звучит так: &quot;Напишите быстрый аллокатор памяти&quot; Как я его понимаю: можно пожертвовать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.