Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C++]Move constructor di shared_ptr

    Giochicchiando un po' con gli smart pointers mi sono imbattuto nel codice sottostante che mi ha sorpreso non poco.
    codice:
    #include <iostream>
    #include <memory>
    #include <utility>
    
    using namespace std;
    
    struct Foo
    {
        ~Foo() { cout << "~Foo()\n"; }
        void f() const { cout << "Foo:f()\n"; }
    };
    
    int main()
    {
        unique_ptr< Foo > un{ new Foo() };
        {
            shared_ptr< Foo> sh = move(un);
    
            sh->f();
        }
    
        if(!un)
            cout << "un is empty\n";
    
        un->f();
    
        return 0;
    }
    Questo codice produce come output:
    codice:
    Foo:f()
    ~Foo()
    un is empty
    Foo:f()
    Ma mi aspettavo almeno UB. Qualcuno saprebbe darmi una spiegazione?

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    E' qualcosa al limite dell'UB. All'atto pratico alcuni compilatori (non so se tutti) permettono di invocare un metodo attraverso un puntatore non valido PURCHE' tale metodo non acceda a variabili membro (si presume che tale comportamento abbia a che fare con ralune ottimizzazioni).
    Se vuoi un UB basta che la funzione f() di Foo acceda a un dato membro (ad es. un int data).
    codice:
    struct Foo
    {
        ~Foo() { cout << "~Foo()\n"; }
        void f() const { data = 0; cout << "Foo:f()\n"; } // BOOM!
        int data;
    };
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Interessante. Grazie mille!

  4. #4
    Richiamare un metodo su un puntatore non valido è sempre UB. Tuttavia, normalmente i metodi non virtuali vengono implementati come normali funzioni che ricevono this come parametro nascosto, e se il metodo non accede ai membri della classe è normale che non si verifichino errori appariscenti. (in effetti, una delle possibili manifestazioni dell'UB è "tutto sembra funzionare correttamente")
    Ultima modifica di MItaly; 17-12-2013 a 00:23
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.