Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623

Нужно ли освобождать память от "sqlite3_column_blob"

13.05.2015, 13:47. Показов 2706. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Достаю blob данные из SQLite3:
C++
1
2
3
4
5
6
7
8
9
int length = sqlite3_column_bytes(stmt,0);
char* pData = new char[length];
 
const char *pBuffer = reinterpret_cast<const char*>(sqlite3_column_blob(stmt,0));
memmove(&pData[0],pBuffer,length); // что остается в pBuffer после такого перемещения ?
 
// ..
 
delete [] pData;
из SQLite3:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**************************** sqlite3_column_  *******************************
** The following routines are used to access elements of the current row
** in the result set.
*/
SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt *pStmt, int i){
  const void *val;
  val = sqlite3_value_blob( columnMem(pStmt,i) );
  /* Even though there is no encoding conversion, value_blob() might
  ** need to call malloc() to expand the result of a zeroblob() 
  ** expression. 
  */
  columnMallocFailure(pStmt);
  return val;
}
Правильно ли что про pBuffer мы забываем или его тоже нужно освободить?
В документации сказано, что memmove перемещает блок памяти и далее написано что блок копируется через промежуточный буфер. memcpy тоже копирует, так в чем разница?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.05.2015, 13:47
Ответы с готовыми решениями:

Нужно ли освобождать память, выделенную под вектор?
Нужно ли освобождать память, если он в цикле пересохдаётся: #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;cstdlib&gt; ...

Нужно ли освобождать память перед повторым выделением?
к примеру мы имеем: char *itsString = new char; delete itsString; char *itsString = new char; Обязательно/желательно ли...

Библиотека STL, нужно ли освобождать память после использования контейнеров?
Когда я использую vector, list, и т.д. мне нужно потом освобождать память или оно само очищается?

3
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.05.2015, 13:55
Лучший ответ Сообщение было отмечено Путин как решение

Решение

Путин (тот самый?), memmove отличается от memcpy только лишь тем, что его можно использовать на перекрывающихся участках памяти. Какого-либо уничтожения или очистки данных в источнике не предполагается.
Если участки памяти заведомо не пересекаются - эффективнее использовать memcpy вместо memmove.
Цитата Сообщение от Путин Посмотреть сообщение
Правильно ли что про pBuffer мы забываем или его тоже нужно освободить?
Похоже, что надо смотреть описание для sqlite3_value_blob.
1
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
13.05.2015, 14:14  [ТС]
Спасибо за memmove и memcpy . Опять же из документации SQLite:
The pointers returned are valid until a type conversion occurs or until sqlite3_step() or sqlite3_reset() or sqlite3_finalize() is called. The memory space used to hold strings and BLOBs is freed automatically. Do not pass the pointers returned by sqlite3_column_blob() into sqlite3_free().
Тоесть как я понял здесь все хорошо, посмотрел а гугле примеры использования blob данных тоже не нашел чтоб где нибудь чистили его..
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.05.2015, 14:20
Цитата Сообщение от Путин Посмотреть сообщение
Тоесть как я понял здесь все хорошо
Похоже на то. Если ты скопировал память сразу после вызова sqlite3_column_blob, то о валидности внутреннего указателя уже можно не беспокоиться. С другой стороны, если в коде обработки данных у тебя нет вызовов упомянутых функций (sqlite3_step() or sqlite3_reset() or sqlite3_finalize()), то и дополнительную память выделять вручную не нужно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.05.2015, 14:20
Помогаю со студенческими работами здесь

Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти
Не скажу за все ОС-и, но под Windows есть менеджер памяти. Когда по ходу кода встречается new, ну или что - то другое для алокации...

Нужно ли освобождать память после использования QMenuBar и QMenu
Здравствуйте. Я динамически выделил память под QMenuBar и QMenu должен ли я ее освободить в конце работы программы? #include...

Нужно ли освобождать память после Socket.SendStream?
mm:=TMemoryStream.Create; mm.LoadFromFile(mess); Socket.SendStream(mm); После этих манипуляций нужно освободить...

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

Dll на C++ кушает память, как правильно удалять и освобождать память?
Добрый день, совсем мало опыта в программировании на C++, помогите пожалуйста знатоки С++. Есть Dll, типа wrapper для библиотеки...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru