Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
QByteArray хранится в куче или в стеке?
|
|||
|---|---|---|---|
|
#18+
В Qt методы возвращают не указатель, а сам массив QByteArray: readAll() //чтение файла qCompress() //сжатие данных ... Возникает вопрос: как под QByteArray выделяется память (динамически / статически)? Если память под QByteArray выделяется динамически (что логично в связи с возможностью менять размер), то по выходе из функции разрушение данных произойти не должно: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Но с другой стороны: где тогда освобождается память? В книжках я не встречал конструкций типа: Код: plaintext 1. Как правильно сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 16:20 |
|
||
|
QByteArray хранится в куче или в стеке?
|
|||
|---|---|---|---|
|
#18+
Если память явно не выделялась (new) то и освобождать ее не надо (delete). Если объект что-то выделял в куче, то он сам освободит. В Qt не силен, но как понимаю твой пример нерабочий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 16:35 |
|
||
|
QByteArray хранится в куче или в стеке?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLКак правильно сделать?прочитать исходники класса QByteArray? Qt - открытая библиотека ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 16:51 |
|
||
|
QByteArray хранится в куче или в стеке?
|
|||
|---|---|---|---|
|
#18+
Что-то я тормознул :) Написал в процедуре: Код: plaintext 1. и отладчиком посмотрел будет ли переход на эту строку при завершении процедуры. Переход был :) Значит мой пример топике неверен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 17:11 |
|
||
|
QByteArray хранится в куче или в стеке?
|
|||
|---|---|---|---|
|
#18+
Как-то сложно все у тебя. Запомни простое правило: освобождать память (delete) нужно только если ты ее выделял (new) Если у тебя в коде нет явного new, то на остальное не заморачивайся, если какие-то объекты используют кучу, то new/delete прописаны внутри этих объектов и они их сами вызовут тогда, когда это необходимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 17:21 |
|
||
|
QByteArray хранится в куче или в стеке?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL, FullData = &CompressData; Это похоже на возврат указателя на данные на стеке, это ошибка видимо. Если возвращать надо в FullData, то *FullData = CompressData; не выполняя delete FullData; Видимо вся функция будет void CompressionData(QByteArray* FullData) { *FullData = qCompress(FullData, 9); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 17:49 |
|
||
|
QByteArray хранится в куче или в стеке?
|
|||
|---|---|---|---|
|
#18+
ну яvoid CompressionData(QByteArray* FullData) { *FullData = qCompress(FullData, 9); } Ты так легко присваиваешь целые массивы, что мне в это не верится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 18:02 |
|
||
|
QByteArray хранится в куче или в стеке?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLну яvoid CompressionData(QByteArray* FullData) { *FullData = qCompress(FullData, 9); } Ты так легко присваиваешь целые массивы, что мне в это не верится. Почитай про Copy-On-Write (implicit sharing) в документации на Qt контейнеры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 18:30 |
|
||
|
QByteArray хранится в куче или в стеке?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLну яvoid CompressionData(QByteArray* FullData) { *FullData = qCompress(FullData, 9); } Ты так легко присваиваешь целые массивы, что мне в это не верится. То есть что qCompress возвращает контейнер по значению, поверилось, и претензий нет, а если использовать по правилам этой библиотеки, претензии есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2017, 20:17 |
|
||
|
QByteArray хранится в куче или в стеке?
|
|||
|---|---|---|---|
|
#18+
NekZПочитай про Copy-On-Write (implicit sharing) в документации на Qt контейнеры. Спасибо, про неявное совместное использование читал, но не думал, что это применимо к массивам от Qt. Оказалось действительно определено: авторQByteArray &QByteArray::operator=(QByteArray &&other) Move-assigns other to this QByteArray instance. This function was introduced in Qt 5.2. Че, молодцы мальчики из Qt. И ты тоже хороший пацанчег :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2017, 10:22 |
|
||
|
QByteArray хранится в куче или в стеке?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLВ Qt методы возвращают не указатель, а сам массив QByteArray: readAll() //чтение файла qCompress() //сжатие данных ... Возникает вопрос: как под QByteArray выделяется память (динамически / статически)? Если память под QByteArray выделяется динамически (что логично в связи с возможностью менять размер), то по выходе из функции разрушение данных произойти не должно: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Но с другой стороны: где тогда освобождается память? В книжках я не встречал конструкций типа: Код: plaintext 1. Как правильно сделать? Сам QByteArray хранится в том классе памяти, где ты его разместишь. В данном примере это -- динамическая память. Но содержимое QByteArray хранится в динамической памяти всегда. Где там что когда освобождать -- дело сугубо твоё личное, как напиешь, но естественно, есть более логичные методы, есть менее. Наиболее логичный метод возврата QByteArray был бы таким: Код: plaintext 1. Второй по логичности Код: plaintext 1. (но это только разве для старых компиляторов, не умеющих ни move, ни RVO). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 10:27 |
|
||
|
QByteArray хранится в куче или в стеке?
|
|||
|---|---|---|---|
|
#18+
Возникает вопрос: как под QByteArray выделяется память (динамически / статически)? Под сам QByteArray память выделяется в соответствии с классом памяти твоей переменной. Под содержимое QByteArray -- всегда динамически. Если память под QByteArray выделяется динамически (что логично в связи с возможностью менять размер), то по выходе из функции разрушение данных произойти не должно: На выходе этой -- нет. Но с другой стороны: где тогда освобождается память? В деструкторе QByteArray В книжках я не встречал конструкций типа: Код: plaintext 1. Это -- переменная (экземпляр) (возможно) класса QByteArray. Что непонятно по поводу этой конструкции -- не ясно. Ну, удаляется переменная, выделенная динамически. Как правильно сделать?[/quot] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 10:32 |
|
||
|
QByteArray хранится в куче или в стеке?
|
|||
|---|---|---|---|
|
#18+
Dima TВ Qt не силен, но как понимаю твой пример нерабочий. Да, пример нерабочий, последняя строка функции -- разный уровень косвенности в переменных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 10:34 |
|
||
|
QByteArray хранится в куче или в стеке?
|
|||
|---|---|---|---|
|
#18+
Dima TКак-то сложно все у тебя. Запомни простое правило: освобождать память (delete) нужно только если ты ее выделял (new) ИЛИ если в документации на фукнцию, возвращающую указатель(ли), не описано явным образом, что нужно удалить эту переменную (переменные) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 10:35 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39442524&tid=2018193]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
167ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 271ms |

| 0 / 0 |
