|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
31.07.2013, 17:35 | #1 |
Студент
Пользователь
Регистрация: 13.11.2009
Сообщений: 65
|
Ссылки, указатели, динамическая память, С++
Доброго дня.
Не могу найти ответа на свои вопросы. Возможно я неправильно ищу или я слепой. Код вроде такого: Код:
Код:
Либо. Код вроде такого: Код:
Код:
после "return byteArray;" byteArray удалится, т.к. по идее, память для него выделилась в стеке и он не может физически там находиться после выхода из зоны видимости. (то есть он то находится, но скорее всего сотрется при вызове следующей функции). Таким образом снова не получается автоматизировать процесс выделения и освобождения памяти. Скажите, правильно ли я думаю в обоих случаях, и если правильно - то как лучше поступать в таком случае (без лишних затрат памяти, времени, максимально удобно и безопасно)? Заранее благодарен. |
31.07.2013, 19:15 | #2 |
Форумчанин
Регистрация: 24.04.2012
Сообщений: 300
|
Зачем ты создаешь в классе объект этого же класса вообще?
Помог? Оставляем отзыв =)
Последний раз редактировалось Helloween; 31.07.2013 в 19:18. |
31.07.2013, 20:07 | #3 | |||
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Helloween
Цитата:
Цитата:
Либо просто запусти свой код под валгриндом и посмотри течет память в каждом из случаев или нет. В первом случае память должна течь, во второй - вроде бы нет, но оно работает? лишних копирований не происходит? - а-то мне чето кажется, что тут: Код:
Цитата:
Но, кроме того, в Qt есть чето типа сборщика мусора (он поможет не всегда - в твоем случае думаю никак не поможет, но часто - ты можешь сделать свои классы безопасными в этом плане если отнаследуешь их от QObject и в конструкторе не забудешь задать родителя) - я смотрю ты кьют используешь... |
|||
31.07.2013, 20:51 | #4 | |
Форумчанин
Регистрация: 24.04.2012
Сообщений: 300
|
Цитата:
Помог? Оставляем отзыв =)
|
|
31.07.2013, 23:29 | #5 | ||
Студент
Пользователь
Регистрация: 13.11.2009
Сообщений: 65
|
Цитата:
Цитата:
|
||
01.08.2013, 01:14 | #6 |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
Никак из приведённых Вами способов делать нельзя - неочевидно и может привести к трудноуловимым ошибкам. Используйте указатели, либо умные указатели (QSharedPointer)
Код:
Код:
Кроме того, QByteArray задействует технолгию "копирование при записи". Другими словами, массив данных не будет копироваться, пока не произойдёт запрос на запись. Код:
|
01.08.2013, 01:17 | #7 |
Старожил
Регистрация: 19.08.2009
Сообщений: 2,119
|
TRIZER
Я думаю, что память не освободится, когда программа выйдет из зоны видимости ссылки test, т.к. память выделилась не в стеке, а сборщика мусора в С++ нет. Если верно, то выходит, в данном случае единственный верный вариант - использовать указатели. И явно высвобождать память. Верно. В C++ можно несколько упростить себе жизнь, если использовать смарт-поинтеры, например: QByteArray* createPacket() { return new QByteArray(); } ... std::unique_ptr<QByteArray> p(createPacket()); при выходе из области видимости память будет автоматически освобождена. В современных компиляторах можно сделать проще: QByteArray createPacket() { return QByteArray(); } либо будет работать return-value-optimization, либо move-конструктор. в обоих случаях дополнительных копий создано не будет. второй вариант нежизнеспособный. т.к. к моменту возврата из функции стековая переменная будет уже уничтожена
А вы почему со мной не соглашаетесь, у вас что, импотенция? (c) ACE Valery
|
01.08.2013, 13:38 | #8 | |||
Студент
Пользователь
Регистрация: 13.11.2009
Сообщений: 65
|
netrino,
Цитата:
Rififi, Цитата:
Цитата:
Код:
|
|||
01.08.2013, 16:45 | #9 | |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
Цитата:
Код:
Код:
|
|
01.08.2013, 16:54 | #10 |
Студент
Пользователь
Регистрация: 13.11.2009
Сообщений: 65
|
Всем спасибо ).
Было познавательно. Тему можно считать закрытой. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Указатели. Динамическая память. | Kazik | Помощь студентам | 2 | 18.01.2014 00:17 |
Указатели. Динамическая память в С++ | Solnze2 | Помощь студентам | 0 | 21.05.2011 10:47 |
Указатели.Динамическая память | Solnze2 | Паскаль, Turbo Pascal, PascalABC.NET | 6 | 12.06.2010 10:08 |
Динамическая память. | Пaвeл | Помощь студентам | 16 | 31.05.2009 21:16 |