abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 14:22 | Nová verze

    HollowByte je zranitelnost typu Denial of Service (DoS) v kryptografické knihovně OpenSSL. Útočník může odesíláním škodlivého payloadu o velikosti pouhých 11 bajtů zaplnit paměť serveru. OpenSSL před ověřením dat vyhradí nepřiměřený blok paměti (až 131 KB). Server pak čeká na data, která nepřišla. Zranitelnost je opravena ve verzích OpenSSL 4.0.1, 3.6.3, 3.5.7, 3.4.6 a 3.0.21.

    Ladislav Hagara | Komentářů: 0
    včera 13:44 | Komunita

    Ve španělské A Coruñě probíhá GUADEC 2026, tj. letošní konference vývojářů a uživatelů desktopového prostředí GNOME. Videozáznamy přednášek jsou k dispozici na YouTube.

    Ladislav Hagara | Komentářů: 0
    včera 13:22 | Komunita

    Společnost Collabora ve spolupráci s Valve vyvíjí Holo Core, tj. port Arch Linuxu pro ARM64 procesory (AArch64), který bude pohánět VR headset Steam Frame. Pro testování Arch Linuxu pro AArch64 jsou k dispozici binární balíčky, zdrojové kódy i kontejner pro Docker nebo Podman.

    Ladislav Hagara | Komentářů: 1
    včera 13:00 | IT novinky

    Mikroprocesor Zilog Z80 byl oficiálně uveden na trh před 50 lety, tj. v červenci 1976. Výroba mikroprocesoru skončila v roce 2024.

    Ladislav Hagara | Komentářů: 0
    včera 02:55 | Bezpečnostní upozornění

    Výzkumníci ze společnosti ESET objevili 11 zapomenutých UEFI shim zavaděčů, které byly podepsány společností Microsoft, a které umožňují útočníkům obejít ochranu UEFI Secure Boot na většině zařízení. Microsoft je zneplatnil (přidal jejich hash do databáze dbx) v rámci aktualizace Patch Tuesday dne 9. června 2026. Uživatelé Linuxu mohou databází aktualizovat pomocí LVFS. Ověřit zneplatnění zavaděčů lze pomocí skriptu uefi-dbx-audit. Jedná se o CVE-2026-8863 a CVE-2026-10797.

    Ladislav Hagara | Komentářů: 3
    17.7. 16:55 | Zajímavý software

    pico-usb-wifi je open source firmware pro Raspberry Pi Pico W, který jej promění v USB Wi-Fi adaptér. Po připojení k počítači se objeví jako zařízení USB CDC-NCM.

    Ladislav Hagara | Komentářů: 0
    17.7. 16:00 | IT novinky

    Americká společnost Google ze skupiny Alphabet bude muset podle nových požadavků Evropské unie umožnit společnosti OpenAI i dalším konkurentům v oblasti umělé inteligence (AI) a internetových vyhledávačů přístup ke svým službám. Ve svém rozhodnutí o tom včera informovala Evropská komise (EK). Opatření má zajistit dodržování pravidel, jejichž cílem je omezit v EU tržní sílu velkých technologických firem. Google s tím nesouhlasí.

    … více »
    Ladislav Hagara | Komentářů: 0
    17.7. 04:55 | Komunita

    Nové verze webových prohlížečů Chrome a Firefox jsou vydávány každé 4 týdny. Aktuální verze Chrome je 150. Aktuální verze Firefoxu je 152. V březnu bylo oznámeno, že od září přejde Chrome na dvoutýdenní cyklus vydávání verzí. To by znamenalo, že Chrome v číslování verzí Firefox brzy přeskočí. Vývojáři Firefoxu proto také od září přecházejí na dvoutýdenní cyklus vydávání verzí. :-)

    Ladislav Hagara | Komentářů: 7
    17.7. 00:22 | Zajímavý software

    Microsoft Comic Chat (Wikipedie), tj. grafický IRC klient z devadesátek, který převáděl konverzace na IRC do podoby komiksových panelů, a který zpopularizoval font Comic Sans, je dnešním dnem open source. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.

    Ladislav Hagara | Komentářů: 3
    16.7. 19:55 | Nová verze

    Byla vydána (𝕏) nová verze 26.7 open source firewallové a routovací platformy OPNsense (Wikipedie). Jedná se o fork pfSense postavený na FreeBSD. Kódový název OPNsense 26.7 je Xenial Xenops. Přehled novinek v příspěvku na fóru.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (11%)
     (7%)
     (2%)
     (17%)
     (30%)
     (5%)
     (6%)
     (2%)
     (15%)
     (24%)
    Celkem 2173 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník


    Dotaz: C++ shared_ptr - constrainty

    3.12.2020 01:45 mokere
    C++ shared_ptr - constrainty
    Přečteno: 602×
    Mám 2 pointery ukazujúce na 2 objekty (iterator a stream). Iterátor prechádza stream. Jeden z tých pointerov (iterator) vracia funkcia ReadLines. Ten druhý by sa mal uvolniť spolu s tým prvým. Ako na to? Skúmal som dokumentáciu a našiel som tam parameter konštruktora Deleter ktorý som využil na zmazanie oboch pointerov vo chcíli keď by sa mal zmazať smart pointer ukazujúci na iterator:
    namespace
    {
    	template<typename CharType = wchar_t>
    	std::basic_istream<CharType>& operator>>(std::basic_istream<CharType>& inputStream, std::basic_string<CharType>& line)
    	{
    		std::getline(inputStream, line);
    		return inputStream;
    	}
    }
    
    template<typename CharType = char>
    auto ReadLines(std::wstring path)
    {
    	auto inputStream = new std::ifstream(path);
    	using iterator = std::istream_iterator<std::basic_string<CharType>>;
    	auto begin = std::shared_ptr<iterator>(
    		new iterator(*inputStream),
    		[inputStream](auto* iterator)
    		{
    			delete iterator;
    			delete inputStream;
    		}
    	);
    	return begin;
    }
    Je toto správne riešenie? Alebo na to idem zle? Lebo fungovať mi to funguje. Ak viete o niečom priamočiarejšom tak sem s tým. Ďakujem.

    Odpovědi

    3.12.2020 01:53 mokere
    Rozbalit Rozbalit vše Re: C++ shared_ptr - constrainty
    A takto sa potom volá funkcia ReadLines:
    auto begin = ReadLines(L"c:\test\newFile21.txt");
    for (auto it = *begin; it != std::istream_iterator<std::string>(); ++it)
    {
    	std::cout << ":" << *it << "n";
    }
    3.12.2020 01:56 mokere
    Rozbalit Rozbalit vše Re: C++ shared_ptr - constrainty
    nejako blbne escapovanie, namiesto n tam malo byť lomitko a n resp std::endl
    3.12.2020 09:20 MadCatX | skóre: 28 | blog: dev_urandom
    Rozbalit Rozbalit vše Re: C++ shared_ptr - constrainty
    #include <fstream>
    #include <iostream>
    #include <stdexcept>
    
    template <typename T>
    void read_lines(const std::string &path, T &&handler)
    {
            std::ifstream s{};
            s.open(path);
            if (!s.is_open())
                    throw std::runtime_error{"Cannot open file"};
    
            std::string str{};
            while (std::getline(s, str).good())
                    handler(str);
    }
    
    int main()
    {
            try {
                    read_lines("abc.txt", [](const std::string &s) { std::cout << s << std::endl; });
            } catch (const std::runtime_error &ex) {
                    std::cout << ex.what() << std::endl;
            }
    
            return 0;
    }
    
    3.12.2020 10:50 10minuteman
    Rozbalit Rozbalit vše Re: C++ shared_ptr - constrainty
    Obecne, jak mas nekde nahe new & delete, vis, ze to nepises dobre. Spravne je vyuzit RAII a vytvorit si nejakou guard tridu: new volas v konstruktoru, delete v destruktoru. Pak mas jistotu, ze se spravne uvolni tvuj resource i pri nestandardnim ukonceni scope (treba pri vyhozeni vyjimky). No ale jelikoz std typy tak uz funguji (tedy svuj resource si hlida uz treba ten ifstream), nemusis to nijak resit a napis to tak, jak ti radi MadCatX.

    Za druhe, std::shared_ptr (a podobne veci) inicializuj pomoci std::make_shared (a podobnych funkci) - je to bezpecnejsi a rychlejsi.
    3.12.2020 19:07 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: C++ shared_ptr - constrainty

    Začal bych od jednoduchého příkladu — implicitní iterace po slovech. To se zařídí třeba takhle:

    #include <fstream>
    #include <iostream>
    #include <iterator>
    #include <string>
    
    namespace {
    
    template<typename C>
    struct ifstream_iterable {
      ifstream_iterable(const std::string &path) : stream_{path} {}
      auto begin() { return iterator{stream_}; }
      auto end() { return iterator{}; }
     private:
      typedef std::istream_iterator<std::basic_string<C>, C> iterator;
      std::basic_ifstream<C> stream_;
    };
    
    }  // namespace
    
    int main() {
      for (auto &w : ifstream_iterable<wchar_t>{"/proc/cpuinfo"})
        std::wcout << w << std::endl;
    }
    

    To bychom měli. Teď je otázka, jak z toho^^^ udělat iteraci po řádcích. Předně pár poznámek k tématu:

    • Tvůj příklad s operátorem >> je mírně špatně v mezích zákona, protože deklarace je hodně podobná této deklaraci v headeru <string>, což sice na první pohled nevadí, ale na druhý pohled tam hraje roli až příliš mnoho složitých detailů kolem pravidel pro hledání identifikátorů. Drobná změna standardu a/nebo (kni)hovny může vést k tomu, že operátor se buď vůbec nepoužije, nebo začne být v konfliktu s operátory z (kni)hovny. Drobnou modifikací se mi podařilo vyrobit (proti)příklad, kdy clang++ i g++ kód přeloží bez varování, ale g++ „přetížený“ operátor použije, zatímco clang++ nikoliv.
    • Jedno (nechvalně) známé řešení ze Zásobníkovéhopřetečení sice vypadá na první pohled hezky a jednoduše, ale vyskytují se v něm tři poněkud nepříjemné a sporné nápady:

      • soukromá dědičnost (která se tu a tam hodí, ale tenhle případ není ani tu, ani tam)
      • kámoši (kterým je ideální se vyhnout, protože všeho všudy ukazují na chybu v návrhu (zapouzdření atd.))
      • dědění od std::string (což je sice technicky možné, ale z hlediska kompatibility a udržovatelnosti kódu je vhodné se takových nápadů vyvarovat)

    Co tedy podniknout? Třeba tohle:

    #include <fstream>
    #include <iostream>
    #include <iterator>
    #include <string>
    #include <utility>
    
    namespace {
    
    template <typename C>
    struct line {
      std::basic_istream<C>& operator <<(std::basic_istream<C> &stream) {
        std::getline(stream, str_);
        return stream;
      }
      operator const std::basic_string<C>&() const & { return str_; }
      operator std::basic_string<C>&() & { return str_; }  // zde se nepoužije
      operator std::basic_string<C>() && { return std::move(str_); }  // -dtto-
     private:
      std::basic_string<C> str_;
    };
    
    template <typename C>
    std::basic_istream<C>& operator >>(std::basic_istream<C> &stream,
                                       line<C> &str) {
      str << stream;
      return stream;
    }
    
    template<typename C>
    struct ifstream_iterable {
      ifstream_iterable(const std::string &path) : stream_{path} {}
      auto begin() { return iterator{stream_}; }
      auto end() { return iterator{}; }
     private:
      typedef std::istream_iterator<line<C>, C> iterator;
      std::basic_ifstream<C> stream_;
    };
    
    }  // namespace
    
    int main() {
      for (const std::wstring &l : ifstream_iterable<wchar_t>{"/proc/cpuinfo"})
        std::wcout << l << std::endl;
    }
    

    Tohle^^^ nedědí od základních typů, nevyvolává příliš mnoho nespecifikovaných rohových případů, nepoužívá kámoše a vystačí si s jednou třídou (dělnickou), kterou lze konvertovat na odpovídající string. (Pro složitější konverze do jiného API si lze napsat deduction guides, ale to už je jiné téma. V této podobě se kód přeloží s C++ 14, 17 i 20, zatímco s deduction guides by vyžadoval minimálně C++17.)

    Ještě závěrem dodám (a předejdu tak, doufám, některým komentářům), že někteří lidé mají utkvělou špatnou představu o sousloví return std::move(...); — myslí si, že něco takového nedává smysl a že by to nemělo existovat. Samozřejmě se mýlí, jak jinak; tady jsou k tomu předdrobnosti i podrobnosti.

    3.12.2020 19:17 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: C++ shared_ptr - constrainty

    A když nad tím znova přemýšlím (což rozhodně nedělám často), čitelnější to bude bez toho nestandardního operátoru <<, který nijak neinteraguje s (kni)hovnou a jenom všeho všudy mate čtenáře (včetně mě). Takže raději třeba takto:

    #include <fstream>
    #include <iostream>
    #include <iterator>
    #include <string>
    #include <utility>
    
    namespace {
    
    template <typename C>
    struct line {
      operator const std::basic_string<C>&() const & { return str_; }
      operator std::basic_string<C>&() & { return str_; }
      operator std::basic_string<C>() && { return std::move(str_); }  // nepoužito
     private:
      std::basic_string<C> str_;
    };
    
    template <typename C>
    std::basic_istream<C>& operator >>(std::basic_istream<C> &stream,
                                       line<C> &str) {
      std::getline(stream, static_cast<std::basic_string<C>&>(str));
      return stream;
    }
    
    template<typename C>
    struct ifstream_iterable {
      ifstream_iterable(const std::string &path) : stream_{path} {}
      auto begin() { return iterator{stream_}; }
      auto end() { return iterator{}; }
     private:
      typedef std::istream_iterator<line<C>, C> iterator;
      std::basic_ifstream<C> stream_;
    };
    
    }  // namespace
    
    int main() {
      for (const std::wstring &l : ifstream_iterable<wchar_t>{"/proc/cpuinfo"})
        std::wcout << l << std::endl;
    }
    
    5.12.2020 17:07 mokere
    Rozbalit Rozbalit vše Re: C++ shared_ptr - constrainty
    Ďakujem Vám všetkým. Aj za to že ste mi opravili chybu s riadkami vs slovami. To bola moja nepozornosť. A popravde som si ju ani nevšimol.

    Každopádne MadCatX to vymyslel zaujímavo.

    Ja som chcel ale napodobniť funkciu ReadLines z .NETu https://docs.microsoft.com/en-us/dotnet/api/system.io.file.readlines?view=net-5.0 ktorá vracia IEnumerable (obsahujúca Enumerator).

    Andrej To čo ste urobili vy je presne to čo som hľadal. Za čo Vám veľmi pekne ďakujem.

    10minuteman Čo sa týka new a delete snažím sa ich používať minimálne. Ale ak pri smartpointeroch používate deleter tak sa použitiu delete nevyhnete. Veď aj smart pointery v konečnom dôsledku volajú delete.

    5.12.2020 22:17 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: C++ shared_ptr - constrainty
    Ale ak pri smartpointeroch používate deleter tak sa použitiu delete nevyhnete.

    To je sice pravda, ale právě nadužívání dynamické alokace je u C++ poměrně častá chyba. Zrovna třeba statement delete iterator; není dobrý nápad (a kdekoho přiměje zvednout obočí), protože iterátor má být (a většinou je) malý kousek dat (něco jako 16 B, dejme tomu), který se dá a má předávat všude hodnotou. (Samozřejmě kromě případu, kdy je potřeba z více míst měnit jeden iterátor, tj. mít něco jako dvouhvězdičkový pointer.)

    Ještě bych poznamenal, jen tak pro úplnost, že příklad v dotazu by byl lepší s použitím std::unique_ptr místo std::shared_ptr. Zatímco std::unique_ptr je jednoduchý zapouzdřený pointer, který vyjadřuje exkluzivní vlastnictví a vlastní z jednoho kontextu jeden kousek dat, std::shared_ptr je složitá mašinerie s atomickým reference-countingem. Uvnitř v implementaci std::shared_ptr neukazuje přímo na data, která spravuje, nýbrž na svou vlastní dynamickou strukturu, ve které má (kromě pointeru) také atomické počítadlo referencí a pár dalších vychytávek. (Dlužno navíc dodat, v souvislosti s atomickým počítadlem, že jedna atomická instrukce může stát čas srovnatelný s řádově tisícem sčítání.) Dá se říct, že std::shared_ptr je v jistém smyslu thread-safe, byť s omezeními:

    • Několik instancí std::shared_ptr, každou z jiného vlákna, lze používat paralelně zcela bez omezení.
    • Použití jedné instance std::shared_ptr několika vlákny (například rozumně atomické přiřazení toho sdíleného pointeru) ovšem samo od sebe atomické není; k tomu slouží specializace std::atomic<std::shared_ptr<...>>.

    Zkrátka a dobře (nebo zdlouha a špatně, teď nevím),

    • kdykoliv je možné vyhnout se přímému použití pointerů, je třeba této příležitosti využít. Všechny kontejnery mají na zásobníku jenom něco velmi malého (jako třeba fixních 16 B nebo tak) a dynamickou alokaci si spravují samy.
    • kdykoliv je možné použít std::unique_ptr místo std::shared_ptr, je to jasná volba, zejména z hlediska efektivity a jednoznačnosti vlastnictví objektů. Atomický reference-counting je potřebný jenom velmi zřídka, nikoliv zhusta.
    6.12.2020 15:21 10minuteman
    Rozbalit Rozbalit vše Re: C++ shared_ptr - constrainty
    No to je prave ono: nepsat to rucne, ale nechat to za sebe resit objekty. Jasne, ze interne k new a delete treba dojde. Alokaci na halde se nejspis nevyhnes. Kdyz to ale za tebe bude resit objekt, mas pak mnohem mene starosti.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.