• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

istream operator >> czy tak można?(new)

Object Storage Arubacloud
0 głosów
217 wizyt
pytanie zadane 5 lutego 2020 w C i C++ przez niezalogowany
edycja 5 lutego 2020

1) czy można napisać operator>> w ten sposób;

#include <iostream>
struct in {
    double* var;
    ~in() {
        delete var;
    }
};
std::istream & operator >> (std::istream & is, in &v) {

    double * zmienna = new double;
    is>>*zmienna;
    v.var=zmienna;
    return is;
    //żeby nie tak
    // double zmienna;
    // v.set(zmienna);

}
using namespace std;

int main() {
    in obj;
    cin>>obj;
    cout <<*(obj.var)<< endl;

    return 0;
}

2) czy tak się stosuje? ewentualnie bez tego delete tylko smart ptr (w razie throw);

3) czy niema wycieku pamięci? 

komentarz 5 lutego 2020 przez tkz Nałogowiec (42,000 p.)
Nie zaciemnia to kodu?
komentarz 5 lutego 2020 przez niezalogowany
niby trochę, ja tak z ciekawości. Bo podobno stos jest ograniczony. A nie chcę do wszystkiego od razu map czy wektora stosować.

1 odpowiedź

0 głosów
odpowiedź 5 lutego 2020 przez tangarr Mędrzec (154,860 p.)
wybrane 5 lutego 2020
 
Najlepsza

1. Zmienna var jest niezainicjalizowana. Jeżeli jej nie ustawisz to destruktor struktury może wywalić program.

2. Wyciek pamięci nastąpi jeżeli drugi raz prześlesz dane do struktury.

Po wprowadzeniu delikatnych zmian powinno działać bezproblemowo.

#include <iostream>
struct in {
    double* var=nullptr;
    ~in() {
        delete var;
    }
};
std::istream & operator >> (std::istream & is, in &v) {
    if (v.var == nullptr)
        v.var = new double;
    is>>*v.var;
    return is;
}
using namespace std;
 
int main() {
    in obj;
    cin>>obj;
    cout <<*obj.var<< endl;
 
    return 0;
}

 

komentarz 5 lutego 2020 przez niezalogowany
Dzięki bardzo;

void set (double *ptrvar){var=ptr;} to nic nie zmienia ?

a jak lepiej przez kopię czy wskaźnik?
komentarz 5 lutego 2020 przez tangarr Mędrzec (154,860 p.)

Powodujesz wyciek pamięci.

void set (double *ptrvar) {
    if (var != nullptr)
        delete var;
    var=ptr;
}

Wydaje mi się, że przekazanie wartości jest lepsze. Unikasz ryzyka związanego ze zwolnieniem pamięci w innym miejscu programu.
 

void set (double value) {
    if (var == nullptr)
        var = new double;
    *var = value;
}

 

komentarz 5 lutego 2020 przez niezalogowany
Dzięki.

Podobne pytania

0 głosów
1 odpowiedź 202 wizyt
0 głosów
2 odpowiedzi 544 wizyt
pytanie zadane 14 grudnia 2015 w C i C++ przez sofnir Gaduła (4,690 p.)
0 głosów
2 odpowiedzi 220 wizyt
pytanie zadane 3 listopada 2016 w C i C++ przez Tinsonu Początkujący (280 p.)

92,659 zapytań

141,552 odpowiedzi

319,991 komentarzy

62,027 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...