Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9

Как правильней переписать код с использованием умных указателей?

06.07.2017, 21:16. Показов 2194. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    TImage *im1 = new TImage(NULL);
    TImage *im2 = new TImage(NULL);
    TPngImage* png = new TPngImage();
    TJPEGImage *jpeg = new TJPEGImage();
    // jpeg
    jpeg->LoadFromFile(ExtractFileDir(Application->ExeName) + "\\file\\1.jpg");
    im1->Picture->Bitmap->Assign(jpeg);
    jpeg->LoadFromFile(ExtractFileDir(Application->ExeName) + "\\file\\2.jpg");
    im2->Picture->Bitmap->Assign(jpeg);
 
    //GenerateTransparenceImage(im1, im2, TrackBar1->Position, jpeg);
    Image2->Picture->Bitmap->Assign(jpeg);
    jpeg->SaveToFile("new.jpg");
    delete im1, im2, jpeg, png;
Который переписывается с помощью умных указателей:
C++
1
2
3
4
5
6
7
8
9
10
11
12
    std::shared_ptr<TImage> im1(new TImage(this));
    std::shared_ptr<TImage> im2(new TImage(this));
    std::shared_ptr<TPngImage> png(new TPngImage());
    std::shared_ptr<TJPEGImage> jpeg(new TJPEGImage());
    // jpeg
    jpeg->LoadFromFile(ExtractFileDir(Application->ExeName) + "\\file\\1.jpg");
    im1->Picture->Bitmap->Assign(jpeg);
    jpeg->LoadFromFile(ExtractFileDir(Application->ExeName) + "\\file\\2.jpg");
    im2->Picture->Bitmap->Assign(jpeg);
 
    Image2->Picture->Bitmap->Assign(jpeg);
    jpeg->SaveToFile("new.jpg");
И получаю следующие вопли:
[bcc64 Error] Unit1.cpp(307): no viable conversion from 'std::shared_ptr<TJPEGImage>' to 'System::Classes::TPersistent *'
memory(764): candidate function
Vcl.Graphics.hpp(1064): passing argument to parameter 'Source' here
[bcc64 Error] Unit1.cpp(309): no viable conversion from 'std::shared_ptr<TJPEGImage>' to 'System::Classes::TPersistent *'
memory(764): candidate function
Vcl.Graphics.hpp(1064): passing argument to parameter 'Source' here
[bcc64 Error] Unit1.cpp(311): no viable conversion from 'std::shared_ptr<TJPEGImage>' to 'System::Classes::TPersistent *'
memory(764): candidate function
Vcl.Graphics.hpp(1064): passing argument to parameter 'Source' here
Что я упускаю из виду?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.07.2017, 21:16
Ответы с готовыми решениями:

Подскажите как переписать класс с использованием умных указателей, либо STL
К сожалению, знания об умных указателях и библиотеке STL прошли мимо меня... Сейчас пытаюсь восполнить этот пробел, но уже третий день не...

Переписать код с использованием указателей
Есть код на C,надо заменить на указатели. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;locale.h&gt; int prov(int a) { ...

Переписать код с использованием указателей
Помогите сделать указатели... #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;locale.h&gt; #define SIZE 5 int func( int...

20
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
06.07.2017, 21:55
Лучший ответ Сообщение было отмечено Gdasar как решение

Решение

Забываешь добавить jpeg.get()?
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
06.07.2017, 22:34  [ТС]
А ларчик просто открывался Спасибо.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.07.2017, 14:08

Не по теме:

А нужен shared ? или может стоит обойтись std::unique_ptr ?



Добавлено через 36 секунд
Цитата Сообщение от Gdasar Посмотреть сообщение
delete im1, im2, jpeg, png;
Нельзя так писать...
im2, jpeg, png не удалятся.

Добавлено через 15 секунд
Цитата Сообщение от Gdasar Посмотреть сообщение
delete im1, im2, jpeg, png;
Нельзя так писать...
im2, jpeg, png не удалятся.
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
07.07.2017, 14:39  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Нельзя так писать...
im2, jpeg, png не удалятся.
Ага, я знаю, но почему-то много лет назад именно так написал. Вот сейчас переписываю и поправляю всё.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3
07.07.2017, 22:23
Цитата Сообщение от Avazart Посмотреть сообщение
Нельзя так писать...
im2, jpeg, png не удалятся.
Это точно? Так как я спецом делал тест, и проверял память после удаления, все было очищено, или это новые компиляторы все чистят?
0
07.07.2017, 22:38

Не по теме:

Цитата Сообщение от Dinkin Посмотреть сообщение
Так как я спецом делал тест, и проверял память после удаления, все было очищено,
Значит хреного проверял ...

0
07.07.2017, 22:52

Не по теме:


Цитата Сообщение от Avazart Посмотреть сообщение
Значит хреного проверял ...
Есть много отличных синонимов: "Плохо", "не правильно", "не верно", "что то сделал ни так" и тд...а тут прям так сразу не культурно:"Хреново" :D

0
07.07.2017, 23:12

Не по теме:

Цитата Сообщение от Dinkin Посмотреть сообщение
Есть много отличных синонимов: "Плохо", "не правильно", "не верно", "что то сделал ни так" и тд...а тут прям так сразу не культурно:"Хреново" :D
Это тоже отличное, или вы что то имеете против растений ? :D

0
08.07.2017, 09:27

Не по теме:

Цитата Сообщение от Dinkin Посмотреть сообщение
Это точно? Так как я спецом делал тест, и проверял память после удаления, все было очищено, или это новые компиляторы все чистят?
Только что проверил ради интереса:
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 TButton *btn1 = new TButton(this);
 TButton *btn2 = new TButton(this);
 
 delete btn1, btn2;
 
 btn2->Parent = this; // Тут все окейно. Объект btn2 не удалился
 btn1->Parent = this; // Тут ловим эксепшн
}
Так что Avazart прав. Проверял на Берлине.

0
08.07.2017, 10:22

Не по теме:

Только это все фигня экцепшена может и не быть.

0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3
08.07.2017, 10:34
d7d1cd, это не проверка, а ошибка из за не правильной логики кода.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.07.2017, 10:40
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    
#include <iostream>
using namespace std;
 
class Test
{
public:
    Test()
    {
        std::cout<<"Test()"<<std::endl;
    }
    ~Test()
    {
        std::cout<<"~Test()"<<std::endl;
    }
};
 
int main()
{
    Test* t1= new Test;
    Test* t2= new Test;
 
    delete t1,t2;
 
    return 0;
}
http://ideone.com/nfvkKF
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
08.07.2017, 18:01
Цитата Сообщение от Dinkin Посмотреть сообщение
это не проверка
Че эт не проверка? Была задача проверить, освобождается ли память оператором delete, когда указатели перечисляются через запятую. Код показывает, что не освобождается.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.07.2017, 18:48
Цитата Сообщение от d7d1cd Посмотреть сообщение
Код показывает, что не освобождается.
Как я сказал исключения может и не быть.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3
08.07.2017, 19:49
d7d1cd, нет. Об освобождении памяти это отдельная тема, она может быть занята даже после удаления..в процессе жизни всей программы.
Если Вы проверяете на наличие указателей на компоненты, то эта проверка тоже не катит...написал бы развернутый ответ, но с телефона не комильфо =)

Добавлено через 57 минут
Цитата Сообщение от d7d1cd Посмотреть сообщение
Че эт не проверка?
C++
1
2
3
4
5
6
7
 TButton * bu = new TButton(this);
 bu->Caption = "Этого текста не должно быть, потому что d7d1cd, считает что после удаления все подчищается";
 
 delete bu; //УДАЛЯЕМ
 
 ShowMessage(bu->Caption); //Чудо!!!
}
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
08.07.2017, 21:47
Dinkin, оставим полемику. Здесь delete btn1, btn2; оператор delete сработает только для btn1. Ведь вся соль именно в этом.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3
08.07.2017, 21:53
Цитата Сообщение от d7d1cd Посмотреть сообщение
оператор delete сработает только для btn1
Ок, продолжим.....
С чего Вы взяли что срабатывает? Из за Вашего не верно примера и не правильного года? Или у Вас сила джидай,что Вы видите что произошло?
Я вам привел пример, что так не проверяют и Ваш код не верный
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
08.07.2017, 21:56
Цитата Сообщение от Dinkin Посмотреть сообщение
С чего Вы взяли что срабатывает?
Из знания синтаксиса С++. Приоритет delete выше, чем у оператора "запятая", поэтому сначала вызовется delete btn1, а потом вхолостую эта самая "запятая" отработает. Не нужно тут никаких приложений для проверки писать.
2
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,153
Записей в блоге: 3
08.07.2017, 22:02
Цитата Сообщение от volvo Посмотреть сообщение
Из знания синтаксиса С++. Приоритет delete выше, чем у оператора "запятая"
ну и лана.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.07.2017, 22:02
Помогаю со студенческими работами здесь

Переписать код с использованием указателей
помогите пожалуйста, нужно не использовать а все сделать через указатели #include &quot;stdafx.h&quot; #include &quot;math.h&quot; ...

Переписать приведенный код с использованием указателей
Есть такой код с функциями. Надо его реализовать через указатели. 3 задания к лабе сделал, а вот ето незнаю как( #include &lt;stdio.h&gt;...

Переписать код с использованием указателей на функцию
Помогите вот эту программу переделать на указатели! Спасибо всем) #include &lt;iostream&gt; #include &lt;locale.h&gt; #include...

Правильное использование умных указателей, как членов класса
Допустим у нас есть класс Node, объекты которого могут хранить вложенные Node, как правильнее объявлять конструктор? Так? class Node...

Объясните как записать код программы с использованием указателей
Раскрасить в массиве при выводе бирюзовым цветом отрицательные элементы на главной диагонали, стоящие после этого минимального элемента. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru