Programowanie w języku C++

Podobne dokumenty
Podstawy programowania w języku C++

Podstawy programowania w języku C++

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Podstawy programowania w języku C++

Wprowadzenie do programowanie obiektowego w języku C++

DYNAMICZNE PRZYDZIELANIE PAMIECI

Programowanie w języku C++

Podstawy programowania w języku C++

Podstawy programowania komputerów

Podstawy programowania w języku C++

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Języki programowania obiektowego Nieobiektowe elementy języka C++

Wykład 1: Wskaźniki i zmienne dynamiczne

Jak Windows zarządza pamięcią?

Podstawy programowania

ZASADY PROGRAMOWANIA KOMPUTERÓW

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Wprowadzenie do programowania w języku C

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Wskaźniki. Informatyka

Programowanie w języku C++

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Podstawy programowania w języku C++

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Lab 9 Podstawy Programowania

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Wstęp do programowania

Podstawy programowania w języku C++

Podstawy programowania w języku C i C++

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

#include "stdafx.h" #include <iostream> #include "windows.h" using namespace std;

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Stałe, tablice dynamiczne i wielowymiarowe

Język C++ Różnice między C a C++

Wstęp do Programowania 2

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Wstęp do programowania

Programowanie obiektowe W3

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Języki i metodyka programowania. Wskaźniki i tablice.

Wskaźniki w C. Anna Gogolińska

Wprowadzenie do programowanie obiektowego w języku C++

Podstawy programowania w języku C++

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Podstawy programowania w języku C++

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Tbli Tablice obiektów biktó są tworzone dokładnie d tak samo, jak i tablice, składające się z elementów innego typu

Wykład 4: Klasy i Metody

Techniki Programowania wskaźniki

Podstawy programowania skrót z wykładów:

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie i struktury danych

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Zmienne i struktury dynamiczne

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Konstruktor kopiujacy

Przekazywanie argumentów wskaźniki

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Język C++ wykład VIII

Wyjątki (exceptions)

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Struktury czyli rekordy w C/C++

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Języki programowania obiektowego Nieobiektowe elementy języka C++

Szablony klas, zastosowanie szablonów w programach

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Informacja o programowaniu w c++ Dr Maciej Bobrowski

KURS C/C++ WYKŁAD 6. Wskaźniki

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Wstęp do programowania

Programowanie obiektowe i C++ dla matematyków

dr inż. Paweł Myszkowski Wykład nr 8 ( )

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów

PARADYGMATY PROGRAMOWANIA Wykład 4

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

tablica: dane_liczbowe

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Transkrypt:

Programowanie w języku C++ Część siódma Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi uważnego w nim uczestnictwa. Opracowanie to jest chronione prawem autorskim. Wykorzystywanie jakiegokolwiek fragmentu w celach innych niż nauka własna jest nielegalne. Dystrybuowanie tego opracowania lub jakiejkolwiek jego części oraz wykorzystywanie zarobkowe bez zgody autora jest zabronione.

Pojęcie sterty heap Sterta Sterta (ang.heap) to wydzielony obszar pamięci: przeznaczony do przechowywania danych dynamicznych, kontrolowany ręcznie przez programistę, ograniczony pod względem rozmiaru. Rozmiar sterty zmienia się wraz ze zmianą środowiska systemowego i kompilatora. Zwykle jest on jednak wystarczający dla typowych programów. Jednak przetwarzanie grafiki czy danych multimedialnych może wymagać ustawień specyficznych. Typowy scenariusz wykorzystania sterty: przydział niezbędnej w danym momencie ilości pamięci najpóźniej jak to możliwe, wykorzystanie przydzielonego obszaru, zwolnienie przydzielonej pamięci natychmiast, gdy nie jest już ona potrzebna. Copyright Roman Simiński Strona : 2

Dynamiczny przydział pamięci w językach C i C++ Zarządzanie pamięcią przydzielaną dynamicznie w języku C W języku C dynamiczny przydział pamięci realizowały funkcje: void * malloc( size_t size ), void * calloc( size_t nitems, size_t size ), void * realloc( void * ptr, size_t size ). Obszary pamięci przydzielone tymi funkcjami należało zwolnić funkcją: void free( void * ptr ). Zarządzanie pamięcią przydzielaną dynamicznie w języku C++ W języku C++ dynamiczny przydział pamięci realizować będzie: operator new, a zwalnianie przydzielonej pamięci: operator delete. Copyright Roman Simiński Strona : 3

Dynamiczny przydział pamięci w językach C i C++ Zarządzanie pamięcią przydzielaną dynamicznie w języku C Funkcje przydzielające pamięć nie są częścią języka, pochodzą z biblioteki zarządzania pamięcią. Funkcje przedzielające pamięć traktowane są jako amorficzne bloki, o liczonym w bajtach rozmiarze zdefiniowanym przez programistę. Typ przdzielanych obszarów nie jest funkcją znany, programista musi panować nad rozmiarami przydzielonych bloków. Zarządzanie pamięcią przydzielaną dynamicznie w języku C++ Zarządzanie pamięcią zostało włączone języka, operatory new i delete są znane kompilatorowi, Stosowanie operatorów new i delete zapewnia aktywowanie konstruktorów dla inicjalizacji tworzonych obieków oraz destruktorów dla czynności kończących przy usuwaniu obiektu z pamięci. Copyright Roman Simiński Strona : 4

Przydział pamięci dla obiektu klasy Square Użycie operatora new powoduje przydzielenie pamięci dla obiektu w obszarze zwanym stertą, oraz inicjalizację tego obiektu z wykorzystaniem odpowiedniego konstruktora. Square * p; p = new Square; cout << p->getside(); delete p; Utworzenie obiektu i inicjalizacja wywołanie konstruktora bezparametrowego Usunięcie obiektu i czynności kończące wywołanie destruktora Można sterować rodzajem inicjalizacji Square * a = new Square; Square * b = new Square( 10 ); Square * c = new Square( *b ); // Aktywowanie konstruktora domyślnego // Aktywowanie konstruktora ogólnego // Aktywowanie konstruktora kopiującego Usuwanie obiektu operatorem delete delete a; delete b; delete c; Operator delete wywołuje destruktor i zwalnia przydzieloną pamięć. Copyright Roman Simiński Strona : 5

Uwagi na temat zwalniania pamięci Operator delete może być stosowany wyłącznie dla obiektów utworzonych operatorem new. Mieszanie operatorów new i delete z funkcjami typu malloc i free daje niezdefiniowane rezultaty. Jeżeli operator delete zostanie użyty dla wskaźnika zerowego, nic się nie stanie a operacja ta nie jest błędna. Dwukrotne (lub wielokrotne) usunięcie tego samego obiektu jest błędem i prowadzi do problemów. Uwaga odwoływanie się do obszaru pamięci, który został wcześniej zwolniony jest błędem zarówno w C jak i w C++. Square * p = new Square; delete p; // To nie jest rozs dne: ą p->setside( 100 ); cout << p->getside(); Copyright Roman Simiński Strona : 6

Uwagi na temat zwalniania pamięci Dobrą praktyką jest zerowanie wskaźnika tuż po zwolnieniu pamięci, Pozwala to na kontrolowanie czy można odwołać się do obiektu wskazywanego w innym miejscu programu. Square * p = new Square; delete p; p = 0; To jest rozsądne: // Wersja 1-sza: if( p ) p->setside( 100 ); // Wersja 2-ga: if( p!= 0 ) p->setside( 100 ); // Wersja 3-cia: if( p!= NULL ) p->setside( 100 ); Uwaga w jęzuku C++ można zakładać, że wskaźnik pusty (pokazujący na nic) ma wartość zero. Korzystanie ze stałej NULL wymaga włączenia przynajmniej pliku nagłówkowego stddef.h. Copyright Roman Simiński Strona : 7

Przedział pamięci dla tablic obiektów Operator new może być wykorzystany do utworzenia tablicy obiektów. Stosowanie tego operatora zapewnia, że dla każdego elementu tablicy zostanie aktywowany konstruktor domyślny. Square * stab = new Square[ 10 ]; Tak utworzona tablica może być wykorzystana w normalny dla tablic sposób: for( int i = 0; i < 10; i++ ) cout << stab[ i ].getside(); Taką tablicę należy jednak usunąć w specyficzny sposób: delete [] stab; Zapewni to uaktywnienie destruktora o ile istnieje dla każdego elementu tablicy. Copyright Roman Simiński Strona : 8

Dynamiczne tablice mogą mieć rozmiar określony zmienną int numofsquares; cout << "Podaj liczbe kwadratow :"; cin >> numofsquares; Square * stab = new Square[ numofsquares ]; for( int i = 0; i < numofsquares; i++ ) cout << stab[ i ].getside() << endl; delete [] stab; Operatory new i delete mogą być stosowane dla typów wbudowanych int n; cout << "Podaj liczbe elementow:"; cin >> n; int * itab = new int[ n ]; for( int i = 0; i < n; i++ ) cout << itab[ i ] << endl; delete [] itab; Copyright Roman Simiński Strona : 9

Należy uważać na dynamicznie przydzielane obszary pamięci int n; cout << "Podaj liczbe elementow:"; cin >> n; int * itab = new int[ n ]; itab = new int[ 10 ]; // Poprzednio przydzielony obszar został utracony for( int i = 0; i < n; i++ ) cout << itab[ i ] << endl; delete [] itab; Można temu częściowo zaradzić int * const itab = new int[ n ]; Tak zdefiniowany wskaźnik nie może być później modyfikowany. Copyright Roman Simiński Strona : 10

Przydział pamięci dla tablic wielowymiarowych Przy alokacji tablic wielowymiarowych wszystkie wymiary poza pierwszym muszą być nieujemnymi wyrażeniami o wartości znanej na etapie kompilacji. Wymiar pierwszy może być zadany zmienną. const int MAX_LINE_LEN = 256; int numoflines; char ( * lines )[ MAX_LINE_LEN ]; cout << "Podaj liczbe linii: "; cin >> numoflines; lines = new char[ numoflines ][ MAX_LINE_LEN ]; for( int i = 0; i < numoflines; i++ ) sprintf( lines[ i ], "Linia nr: %-2d", i + 1 ); cout << endl << lines[ i ]; delete [] lines; Copyright Roman Simiński Strona : 11

Gdy pamięci jest za mało... Jeżeli operator new nie potrafi znaleźć ciągłego, wolnego obszaru pamięci dla obiektu: sprawdza czy programista zdefiniował specjalną funkcję obsługi takiej sytuacji, jeżeli taka funkcja istnieje, jest ona wywoływana, w przeciwnym wypadku generowany jest wyjątek, dawniej rezultatem operatora była wartość zero. Programista definiuje własną funkcję obsługi braku pamięci wykorzystując funkcję set_new_handler() zdefiniowaną w pliku nagłówkowym new.h. Ma to być bezparametrowa funkcja o rezultacie void, np: void out_of_memory() cerr << "Brak pamięci"; exit( EXIT_FAILURE ); Copyright Roman Simiński Strona : 12

Czy to działa sprawdź kiedy skończy się pamięć #include <iostream> #include <cstdlib> #include <new> using namespace std; void out_of_memory() cerr << "Brak pamięci"; exit( EXIT_FAILURE ); int main() set_new_handler( out_of_memory ); for(;;) new int[ 100000 ]; return EXIT_SUCCESS; Copyright Roman Simiński Strona : 13