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

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

06.07.2017, 21:16. Показов 2216. Ответов 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
33403 / 21513 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 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,154
Записей в блоге: 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,154
Записей в блоге: 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,154
Записей в блоге: 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,154
Записей в блоге: 3
08.07.2017, 21:53
Цитата Сообщение от d7d1cd Посмотреть сообщение
оператор delete сработает только для btn1
Ок, продолжим.....
С чего Вы взяли что срабатывает? Из за Вашего не верно примера и не правильного года? Или у Вас сила джидай,что Вы видите что произошло?
Я вам привел пример, что так не проверяют и Ваш код не верный
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33403 / 21513 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
08.07.2017, 21:56
Цитата Сообщение от Dinkin Посмотреть сообщение
С чего Вы взяли что срабатывает?
Из знания синтаксиса С++. Приоритет delete выше, чем у оператора "запятая", поэтому сначала вызовется delete btn1, а потом вхолостую эта самая "запятая" отработает. Не нужно тут никаких приложений для проверки писать.
2
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,154
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru