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

alokacja obiektów

VPS Starter Arubacloud
0 głosów
600 wizyt
pytanie zadane 28 sierpnia 2017 w C i C++ przez Darven Użytkownik (860 p.)

Witam.

Mam kod, w którym alokuje pewną ilość obiektów, a potem przeprowadzam na nich pewne operacje na metodach. I mam problem, bo chyba nie do końca rozumiem zasady działania. W komentarzach napisałem jak ja rozumiem owy fragment kodu:

#include <conio.h>
#include "stdafx.h"
class Klasa
{
	int x;
public:
	Klasa(int xx = 0) { x = xx; }
	void stworz()
	{
		cin >> x;
	}
	void wyswietl()
	{
		cout << x << endl;
	}

};


int main()
{
	Klasa *obiekt = new Klasa[2]; // alokuje dwa obiekty

	obiekt->stworz(); //przypisuje wartosc "x" obiektowi peirwszemu
	
	obiekt++; // przesuwam wskaźnik na kolejny obiekt

	obiekt->stworz(); // przypisuje wartosc "x" drugiemu obiektowi

	obiekt = 0; // cofam wskanik do pcozatku

	obiekt->wyswietl(); // wyswietlam wartosc "x" obiektu pierwszego
	obiekt++; // przesuwam wskaznik na kolejny obiekt
	obiekt->wyswietl(); // wyswietlam wartosc "x" obiektu drugiego

	delete[] obiekt; // usuwam obiekt

	getch();
	return 0;
}

Czy ja dobrze rozumuje?? Jeśli nie, to prosiłbym o poprawienie komentarzy :D

A teraz do rzeczy. Piszę to, ponieważ kod nie działa w tym zapisie. Po podaniu wartości zmiennej obu obiektom, mam problem z ich wyświetleniem. Wyskakuje takie info: takie info

Nie mam zielonego pojęcia co jest grane. Może po prostu źle rozumiem odwoływanie się do metod klasy przez wskaźnik. Tak czy inaczej, program nie chce wyswietlic wartosci obiektow ktore podam.

2 odpowiedzi

+2 głosów
odpowiedź 28 sierpnia 2017 przez criss Mędrzec (172,590 p.)
wybrane 29 sierpnia 2017 przez Darven
 
Najlepsza
obiekt = 0; // cofam wskanik do pcozatku

Tu jest problem. Fakt cofasz do początku, ale wziąłeś ten początek troche zbyt ogólnie :D Chcesz cofnąć do początku tablicy a nie do początku pamięci w ogóle. Także w tym przypadku wystarczy, że zamienisz powyższą linie na
--obiekt;.

I jeszcze jedna sprawa: 
 

delete[] obiekt;

delete[] musi otrzymać dokładkie ten sam adres który wypluł new[]. Dokładnie ten sam adres jaki masz w obiekt w linii 22.

+1 głos
odpowiedź 28 sierpnia 2017 przez 10kw10 Pasjonat (22,880 p.)
obiekt = 0; // cofam wskanik do pcozatku

To jest to samo co:

obiekt = nullptr;

Wiec nie, nie cofasz do poczatku tylko ustawiasz wskaznik na nic. To sie chyba nazywa wyciek pamieci, choc nie jestem pewny.

Jak chcesz cofnac to uzyj poprostu --, a najlepiej korzystaj z operatora []

komentarz 28 sierpnia 2017 przez 10kw10 Pasjonat (22,880 p.)
Mozna wiedziec czemu downvote?

Podobne pytania

0 głosów
1 odpowiedź 552 wizyt
pytanie zadane 12 sierpnia 2016 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 3,370 wizyt
pytanie zadane 19 lipca 2016 w C i C++ przez JAKUBW Nałogowiec (33,470 p.)
0 głosów
1 odpowiedź 390 wizyt
pytanie zadane 25 sierpnia 2020 w C i C++ przez fortuna Początkujący (310 p.)

93,028 zapytań

141,991 odpowiedzi

321,294 komentarzy

62,375 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...