Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: autoptr w/ C++

progo [20.04.2008 14:53:42]

#

Tuli tämmöinen case mieleen. Jos olisi esimerkkinä funktio, jossa luodaan olio ja palautetaan sen osoitin kutsuvalle funktiolle, niin sehän luonnollisesti katoaa jos se on automaattisesti luotu. Ja dynaaminen olio on taas hankala kun sen poistaminen on vähän kankeata, jos sen luo täysin satunnaisessa funktiossa, ei luokan sisältä. Olisiko auto_ptr:stä hyötyä tässä tapauksessa?

Edit: testailin vähän. Ei tunnu onnistuvan.
Edit2: sainpa toimimaan sen ajatuksen. Tässä joku koodinpätkä.

#include <iostream>
#include <memory>
using namespace std;

class Func {
private:
    int *s;
public:
    Func(int c) {
        s = new int(c);
        cout << "(" << *s << ") Func init'd" << endl;
    }
    ~Func() {
        cout << "(" << *s << ") Func deinit'd" << endl;
        delete s;
    }

    void print() {
        cout << "Me number is " << *s << endl;
    }
};

Func* createFunc(int c) {
    return new Func(c);
}
auto_ptr<Func> createFuncAuto(int c) {
    return auto_ptr <Func> (new Func(c));
}

int main() {
    auto_ptr<Func> bar = createFuncAuto(10);
    Func* foo = createFunc(-4);

    // käyttö onnistuu kuten olettaisi.
    // Paitsi, että ei. auto_ptr on näköjään overloadannut -> -operaattorin,
    // jotta sisäfunktiota (heh) on nopsakka käytellä
    bar->print();
    foo->print();

    // foo pitää erikseen deletoida.
    delete foo;
    return 0;
}

koo [20.04.2008 23:32:36]

#

No juurikin tällaisissa tapauksissa auto_ptr:stä on hyötyä.

Miten niin "käyttö onnistuu kuten olettaisi. Paitsi, että ei."? Se, että auto_ptr overloadaa -> -operaattorin on justiinsa sitä varten, että auto_ptr toimisi tässä suhteessa kuin ihan tavallinen naked pointteri.

Edit: Niin, ja vaikka funktio palauttaisi ihan vaan osoittimen, niin sen voi alustaa auto_ptr:iin, ja hoituu sitten se deletointi itsekseen.

os [23.04.2008 12:34:14]

#

Boost-kirjastosta saattaa olla apua tämän kaltaisissa ongelmissa. Tai ainakin voi ottaa mallia.

http://cosy.univ-reims.fr/~arenard/romeo2/documents/boost/libs/ptr_container/doc/tutorial.html#new-functions

progo [23.04.2008 14:35:39]

#

koo kirjoitti:

Edit: Niin, ja vaikka funktio palauttaisi ihan vaan osoittimen, niin sen voi alustaa auto_ptr:iin, ja hoituu sitten se deletointi itsekseen.

Tätä oikeastaan hainkin, ei tunnu mielekkäältä määrätä funktion, olkoon se nyt miten spesifinen tahansa, paluutyyppiä auto_ptr<>-tyyppiseksi.

Boost-esimerkit menevät vähän yli hilseen. Se on melko moninainen systeemi muutenkin.

Metabolix [23.04.2008 16:03:56]

#

Esimerkiksi tämä auto_ptr-aiheinen artikkeli vaikutti olevan asiapitoisuuden ja yksinkertaisuuden suhteen varsin optimoitu, vähintäänkin peruasiat käyvät hyvin ilmi: http://www.gotw.ca/publications/using_auto_ptr_effectively.htm

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta