Czy ktoś mi może powiedzieć co źle robię ze zwalnianiem pamięci ? dziękuje.

0
#include "pch.h"
#include <iostream>
using namespace std;
class person {
public:
	
	typedef struct {
		int id;
		char imie[20];
		char nazwisko[20];
		int wiek;
	} tosoba;
	
	int size;
	
	tosoba *tab = new tosoba[size];

	void add_person() {

		 
		
		
		for (int i = 0; i < size; i++)
		{
			cout << "Podaj ID: ";
			cin >>tab[i].id;
			cout << "Podaj imie: ";
			cin >> tab[i].imie;
			cout << "Podaj nazwisko: ";
			cin >> tab[i].nazwisko;
			cout << "Podaj wiek: ";
			cin >> tab[i].wiek;

		}
		

	
	}

	void show_person()
	{
		for (int i = 0; i < size; i++)
		{
			
			cout<< tab[i].id<<endl;
			
			cout << tab[i].imie << endl;
			
			cout << tab[i].nazwisko << endl;
			
			cout << tab[i].wiek << endl;
			
		}
		
	}

	
	
};




int main()
{
	int size;
	cout << "Podaj rozmiar tablicy:" << endl;
	cin >> size;
	
	person p;
	p.size=size;
	p.add_person();
	p.show_person();
	delete[]p.tab;
	


	

}
3
    int size;

    tosoba *tab = new tosoba[size];

Tu masz UB, bo size nie ma zdefiniowanej wartości. Takie rzeczy, jeśli musisz, lepiej rób jawnie w konstruktorze. Ponadto, po co stosujesz nagie new i delete? https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

    delete[]p.tab;

To powinno być w destruktorze (albo, lepiej: nigdzie). Poczytaj o rule of three/five/zero: https://en.cppreference.com/w/cpp/language/rule_of_three

0

Ok, przeczytam obydwa artykuły. Treść zadania wymaga zwolnienia pamięci po zakończeniu programu więc muszę użyć delete. Size nie jest przekazywana do obiektu w funkcji głównej ? Dopiero się uczę więc proszę o wyrozumiałość, nie mieliśmy jeszcze destruktorów ale o tym tez poczytam.

3
    person p;

W tej linijce obiekt p jest już utworzony, a więc wywołane zostało new tosoba[size]. Tutaj możesz chcieć użyć konstruktora.

std::vector zapewnia zwolnienie pamięci, więc jeśli tylko zadanie nie dotyczy właśnie tego, to możesz go użyć. Jaka jest treść zadania?

1
Pabloo111 napisał(a):

Treść zadania wymaga zwolnienia pamięci po zakończeniu programu więc muszę użyć delete.

Jeśli faktycznie masz spełnić wymaganie "zwolnienia pamięci", to znaczy że równie dobrze możesz użyć std::vector lub mądrych wskaźników, zamiast new / delete.
No chyba, że masz w treści napisane użyj new / delete.

0

Zadeklaruj wskaźnik na:
a)zmienną typu integer;
b)zmienną typu double;
c)zmienną typu float;
d)tablicę liczb typu integer o rozmiarze N, gdzie N – stała;
W programie głównym należy utworzyć zmienne dynamiczne odpowiadające zadeklarowanym typom oraz zainicjować utworzone zmienne wartościami losowymi lub wartościami wprowadzanymi z klawiatury. Zawartość zmiennych ma zostać wyprowadzona na ekran. Przed zakończeniem programu należy zwolnić pamięć.

0

No to jednak musisz używać surowych wskaźników Bracie. Przykład dla int-a

int *intPointer = new int;
*intPointer = 10;//tutaj to musisz zrobić albo to losowanie, albo wpisywanie wartości z palca
cout << "int *pointer:" << *intPointer;
delete intPointer;

trochę więcej gimnastyki będzie z tą tablicą, tutaj uważnie sprawdź materiały szkoleniowe jak się dynamicznie tablicę typów tworzy, i jak się potem zwalnia pamięć użytą na taką tablicę.

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