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

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

06.07.2017, 21:16. Показов 2138. Ответов 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
33192 / 21488 / 8233
Регистрация: 22.10.2011
Сообщений: 36,872
Записей в блоге: 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
8484 / 6151 / 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,140
Записей в блоге: 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,140
Записей в блоге: 3
08.07.2017, 10:34
d7d1cd, это не проверка, а ошибка из за не правильной логики кода.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 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
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.07.2017, 18:48
Цитата Сообщение от d7d1cd Посмотреть сообщение
Код показывает, что не освобождается.
Как я сказал исключения может и не быть.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,140
Записей в блоге: 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,140
Записей в блоге: 3
08.07.2017, 21:53
Цитата Сообщение от d7d1cd Посмотреть сообщение
оператор delete сработает только для btn1
Ок, продолжим.....
С чего Вы взяли что срабатывает? Из за Вашего не верно примера и не правильного года? Или у Вас сила джидай,что Вы видите что произошло?
Я вам привел пример, что так не проверяют и Ваш код не верный
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33192 / 21488 / 8233
Регистрация: 22.10.2011
Сообщений: 36,872
Записей в блоге: 12
08.07.2017, 21:56
Цитата Сообщение от Dinkin Посмотреть сообщение
С чего Вы взяли что срабатывает?
Из знания синтаксиса С++. Приоритет delete выше, чем у оператора "запятая", поэтому сначала вызовется delete btn1, а потом вхолостую эта самая "запятая" отработает. Не нужно тут никаких приложений для проверки писать.
2
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,140
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru