powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / QByteArray хранится в куче или в стеке?
14 сообщений из 14, страница 1 из 1
QByteArray хранится в куче или в стеке?
    #39442389
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;



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

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

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



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

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

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

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

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

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

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

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

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

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

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


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

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

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



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

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

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

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


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