Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502

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

23.01.2018, 22:50. Показов 1847. Ответов 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.01.2018, 22:50
Ответы с готовыми решениями:

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

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

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

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

Решение

Цитата Сообщение от zombivadim Посмотреть сообщение
998 - Неверная попытка доступа к адресу памяти
Ну всё верно. Где то в ядре происходит исключение при записи в буффер который ты указал, потому что его размер слишком мал, и происходит запись за его границы.
А всё от того, что должно быть так.
C++
1
LPBYTE pBuffer = (LPBYTE)VirtualAlloc(NULL, dwSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
1
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
24.01.2018, 19:37  [ТС]
jr_, Спасибо! Я настолько привык везде использовать sizeof, что записал его по инерции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.01.2018, 19:37
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru