Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / QByteArray хранится в куче или в стеке? / 14 сообщений из 14, страница 1 из 1
21.04.2017, 16:20
    #39442389
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QByteArray хранится в куче или в стеке?
В Qt методы возвращают не указатель, а сам массив QByteArray:
readAll() //чтение файла
qCompress() //сжатие данных
...

Возникает вопрос: как под QByteArray выделяется память (динамически / статически)? Если память под QByteArray выделяется динамически (что логично в связи с возможностью менять размер), то по выходе из функции разрушение данных произойти не должно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
void CompressionData(QByteArray* FullData)
{
    //сожмем данные
    QByteArray CompressData = qCompress(FullData, 9);

    //очистим старый массив
    FullData->clear();
    delete FullData;

    //положим в указатель новое значение
    FullData = &CompressData;
}



Но с другой стороны: где тогда освобождается память? В книжках я не встречал конструкций типа:
Код: plaintext
1.
delete QByteArray_Data;



Как правильно сделать?
...
Рейтинг: 0 / 0
21.04.2017, 16:35
    #39442407
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QByteArray хранится в куче или в стеке?
Если память явно не выделялась (new) то и освобождать ее не надо (delete). Если объект что-то выделял в куче, то он сам освободит.

В Qt не силен, но как понимаю твой пример нерабочий.
...
Рейтинг: 0 / 0
21.04.2017, 16:51
    #39442424
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QByteArray хранится в куче или в стеке?
AlekseySQLКак правильно сделать?прочитать исходники класса QByteArray? Qt - открытая библиотека
...
Рейтинг: 0 / 0
21.04.2017, 17:11
    #39442444
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QByteArray хранится в куче или в стеке?
Что-то я тормознул :)

Написал в процедуре:
Код: plaintext
1.
QByteArray ba("Hello");



и отладчиком посмотрел будет ли переход на эту строку при завершении процедуры. Переход был :)

Значит мой пример топике неверен.
...
Рейтинг: 0 / 0
21.04.2017, 17:21
    #39442452
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QByteArray хранится в куче или в стеке?
Как-то сложно все у тебя. Запомни простое правило: освобождать память (delete) нужно только если ты ее выделял (new)

Если у тебя в коде нет явного new, то на остальное не заморачивайся, если какие-то объекты используют кучу, то new/delete прописаны внутри этих объектов и они их сами вызовут тогда, когда это необходимо.
...
Рейтинг: 0 / 0
21.04.2017, 17:49
    #39442467
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QByteArray хранится в куче или в стеке?
AlekseySQL,

FullData = &CompressData;
Это похоже на возврат указателя на данные на стеке, это ошибка видимо.
Если возвращать надо в FullData, то
*FullData = CompressData;
не выполняя
delete FullData;

Видимо вся функция будет
void CompressionData(QByteArray* FullData)
{
*FullData = qCompress(FullData, 9);
}
...
Рейтинг: 0 / 0
21.04.2017, 18:02
    #39442475
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QByteArray хранится в куче или в стеке?
ну яvoid CompressionData(QByteArray* FullData)
{
*FullData = qCompress(FullData, 9);
}

Ты так легко присваиваешь целые массивы, что мне в это не верится.
...
Рейтинг: 0 / 0
21.04.2017, 18:30
    #39442484
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QByteArray хранится в куче или в стеке?
AlekseySQLну яvoid CompressionData(QByteArray* FullData)
{
*FullData = qCompress(FullData, 9);
}

Ты так легко присваиваешь целые массивы, что мне в это не верится.
Почитай про Copy-On-Write (implicit sharing) в документации на Qt контейнеры.
...
Рейтинг: 0 / 0
21.04.2017, 20:17
    #39442524
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QByteArray хранится в куче или в стеке?
AlekseySQLну яvoid CompressionData(QByteArray* FullData)
{
*FullData = qCompress(FullData, 9);
}

Ты так легко присваиваешь целые массивы, что мне в это не верится.
То есть что qCompress возвращает контейнер по значению, поверилось, и претензий нет, а если использовать по правилам этой библиотеки, претензии есть?
...
Рейтинг: 0 / 0
22.04.2017, 10:22
    #39442623
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QByteArray хранится в куче или в стеке?
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. И ты тоже хороший пацанчег :)
...
Рейтинг: 0 / 0
24.04.2017, 10:27
    #39443093
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QByteArray хранится в куче или в стеке?
AlekseySQLВ Qt методы возвращают не указатель, а сам массив QByteArray:
readAll() //чтение файла
qCompress() //сжатие данных
...

Возникает вопрос: как под QByteArray выделяется память (динамически / статически)? Если память под QByteArray выделяется динамически (что логично в связи с возможностью менять размер), то по выходе из функции разрушение данных произойти не должно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
void CompressionData(QByteArray* FullData)
{
    //сожмем данные
    QByteArray CompressData = qCompress(FullData, 9);

    //очистим старый массив
    FullData->clear();
    delete FullData;

    //положим в указатель новое значение
    FullData = &CompressData;
}



Но с другой стороны: где тогда освобождается память? В книжках я не встречал конструкций типа:
Код: plaintext
1.
delete QByteArray_Data;



Как правильно сделать?


Сам QByteArray хранится в том классе памяти, где ты его разместишь.
В данном примере это -- динамическая память.
Но содержимое QByteArray хранится в динамической памяти всегда.
Где там что когда освобождать -- дело сугубо твоё личное, как напиешь,
но естественно, есть более логичные методы, есть менее.
Наиболее логичный метод возврата QByteArray был бы таким:

Код: plaintext
1.
QByteArray CompressionData();



Второй по логичности

Код: plaintext
1.
void CompressionData(QByteArray &dst);



(но это только разве для старых компиляторов, не умеющих ни move, ни RVO).
...
Рейтинг: 0 / 0
24.04.2017, 10:32
    #39443099
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QByteArray хранится в куче или в стеке?
Возникает вопрос: как под QByteArray выделяется память (динамически / статически)?

Под сам QByteArray память выделяется в соответствии с классом памяти твоей переменной.
Под содержимое QByteArray -- всегда динамически.

Если память под QByteArray выделяется динамически (что логично в связи с возможностью менять размер), то по выходе из функции разрушение данных произойти не должно:

На выходе этой -- нет.


Но с другой стороны: где тогда освобождается память?

В деструкторе QByteArray

В книжках я не встречал конструкций типа:
Код: plaintext
1.
delete QByteArray_Data;



Это -- переменная (экземпляр) (возможно) класса QByteArray.
Что непонятно по поводу этой конструкции -- не ясно. Ну, удаляется переменная, выделенная динамически.

Как правильно сделать?[/quot]
...
Рейтинг: 0 / 0
24.04.2017, 10:34
    #39443101
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QByteArray хранится в куче или в стеке?
Dima TВ Qt не силен, но как понимаю твой пример нерабочий.

Да, пример нерабочий, последняя строка функции -- разный уровень косвенности в переменных.
...
Рейтинг: 0 / 0
24.04.2017, 10:35
    #39443102
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QByteArray хранится в куче или в стеке?
Dima TКак-то сложно все у тебя. Запомни простое правило: освобождать память (delete) нужно только если ты ее выделял (new)

ИЛИ если в документации на фукнцию, возвращающую указатель(ли), не описано явным образом, что нужно удалить эту переменную (переменные)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / QByteArray хранится в куче или в стеке? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]