Destruktor niszczy obiekt

Odpowiedz Nowy wątek
2015-02-03 17:17
Włodzimierz_
0

Witam serdecznie.

Chciałbym się dowiedzieć w jaki sposób prawodłowo korzystać z destruktora i zwalniac pamięć porzez "delete".

Mój pierwszy problem polega na tym, że mam zdefiniowany destruktor w którym :
~class()
{
delete x;
}
i gdy stworze obiekt klasy class
class c1();

to obiekt ten automatyccznie jest kasowany przez konstruktor, ktory wczesniej zadeklarowałem.

Proszę o wskazówki jak poslugiwać się tym narzedziem

Pozostało 580 znaków

2015-02-03 17:21
2
#include <iostream>
#include <memory>
using namespace std;

struct do_not{
    unique_ptr<int> manage_memory_directly;
};

int main() {
    do_not dont;
    dont.manage_memory_directly = make_unique<int>(5);
    cout << *dont.manage_memory_directly << endl;
    return 0;
}
edytowany 1x, ostatnio: spartanPAGE, 2015-02-03 18:00
ta linijka z auto& foo brzydka - gośćabc 2015-02-03 17:59

Pozostało 580 znaków

2015-02-03 17:21
0
Włodzimierz_ napisał(a):

i gdy stworze obiekt klasy class
class c1();
to obiekt ten automatyccznie jest kasowany przez konstruktor, ktory wczesniej zadeklarowałem.

To nie ma żadnego sensu. Może jakiś działający (może być niepoprawnie) kawałek kodu?

Pozostało 580 znaków

2015-02-03 17:32
2

Teoretycznie możesz tak zrobić, np. na uczelnię jeżeli MUSISZ użyć raw pointera.

class klasa{
klasa() :
    m_data(new data())
{}

~klasa()
{
    delete m_data;
}

Data* m_data;
}

W praktyce lepiej dać tak jak podał spartanPAGE

class klasa{
klasa():
    m_data(new Data())
{}

   shared_ptr<Data> m_data;
}

Edit: Poprawka, trochę się pospieszyłem w drugim konstruktorze, nie musisz dawać make_shared, new też powinno działać, a shred_ptr sobie go "przejmie" i usunie gdy będzie taka potrzeba.

edytowany 2x, ostatnio: Zellus, 2015-02-03 17:39
Mała uwaga: struktury używające surowych wskaźników na uczelnie zazwyczaj nie są odporne na kopiowanie, dlatego unique_ptr jest w tym wypadku lepszym zamiennikiem. - spartanPAGE 2015-02-03 17:46
@Zellus niemniej make_shared jest lepsze niż new - twonek 2015-02-03 17:50

Pozostało 580 znaków

2015-02-03 17:53
Włodzimierz_
0

Dziękuje za odpowiedz.

Poniżej jest mój kod, juz troche zmodyfikowany.

http://pastebin.com/RF4cDp7t

Gdy z destruktora usunę delete wartosc1,wartosc2
to przeładowanie operatorów normalnie działa i wyswietla poprawną wartość.

Niestety, gdy destruktor posiada taką forme jak w linku, to program pokazuje adres jakies komorki pamięci i się sypie.

Pozostało 580 znaków

2015-02-03 17:56
0

W twoim przykładzie użycie wskaźników jest bezsensowne.

Pozostało 580 znaków

2015-02-03 17:59
Włodzimierz_
0
spartanPAGE napisał(a):

W twoim przykładzie użycie wskaźników jest bezsensowne.

Wykładowca kazał mi w konstruktorze zainicjalizować dynamicznie 2 zmienne. W takim razie
jak ma to wygladac z sesnem ?

Program miał dodawac te zmienne z 2 obiektóww ( przeladowanie operatora + )

Pozostało 580 znaków

2015-02-03 18:08
1

patrz Włodek

user image

edytowany 1x, ostatnio: gośćabc, 2015-02-03 18:09

Pozostało 580 znaków

2015-02-03 19:47
4

Ludzie, dlaczego na siłę wszędzie wpychacie newbie C++11/14?

@Włodzimierz_ musisz zdefiniować konstruktor kopiujący i operator=. Każda klasa, która posiada nietrywialny destruktor najprawdopodobniej musi także implementować własny konstruktor kopiujący i operator=. Jest to tzw. the rule of three.

Właściwie tyle ci wystarczy. Jeśli jednak będziesz bardziej ambitny to może po napisaniu tego operatora i konstruktora dojdziesz do wniosku, że sporo kodu powielasz. W takim wypadku możesz zainteresować się idiomem copy and swap. Idąc jeszcze dalej możesz poczytać nt the rule of five (dodatkowy konstruktor i operator= ) oraz the rule of zero. Powodzenia ;)

wiesz, idąc Twoim rozumowaniem nie powinniśmy na siłę używać std::string tylko const char* - gośćabc 2015-02-03 19:49
Dobrze skondensowane :D W sumie, skoro jest nowy standard , to chyba warto już od początku sie z nim oswajać? - Proxima 2015-02-03 19:49
@gośćabc gdzie tak napisałem? Mówię tylko o tym, że nie nauczysz się programować w C++ omijając wszystko co można zastąpić technikami z C++0x/1z. Później przyjdzie taki mistrz do pracy i będzie miał problem z jakąś biblioteką to polecisz mu żeby przepisał ją na C++1z? - satirev 2015-02-03 19:53
@Satirev niet, wtedy już pewnie nie będzie miał problemu z poświęceniem 30 min na ogarnięcie "starego tematu na gotowym kodzie", a kodowania w nowym standardzie się nie nauczy czytając stary badziew - gośćabc 2015-02-03 19:58
suma sumarum, powinieneś się uczyć od nowego do starego a nie odwrotnie - gośćabc 2015-02-03 20:00
Większości featurów z C++11/14/1z nie zrozumie się bez znajomości wcześniejszych wersji C++. Natomiast zgadzam się z tym, że należy się uczyć od najnowszych standardów. - satirev 2015-02-03 20:07

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0