#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;
}
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
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.
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?
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
.
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ęć.
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ę.