Destruktor niszczy obiekt

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

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;
}
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?

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.

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.

0

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

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 + )

1

patrz Włodek

user image

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 ;)

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