Dynaaminen muisti. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät 2017.

Samankaltaiset tiedostot
Dynaaminen muisti Rakenteiset tietotyypit

Osoittimet ja taulukot

Loppukurssin järjestelyt

Loppukurssin järjestelyt C:n edistyneet piirteet

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Rakenteiset tietotyypit Moniulotteiset taulukot

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Lyhyt kertaus osoittimista

Moduli 2: Osoittimet ja taulukot. Joel Huttunen

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Osoittimet ja taulukot

7. Oliot ja viitteet 7.1

Moduli 4: Moniulotteiset taulukot & Bittioperaatiot

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Moduli 5: Kehittyneitä piirteitä

1. Mitä seuraava ohjelma tulostaa? Vastaukseksi riittää yksi rivi joka esittää tulosteen. (6 p)

Sisältö. C-ohjelmointi Luento 5: Osoittimet. Keko (heap) Pino (stack) Muistinhallinta Java vs C. Prosessin rakenne

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Osoitin ja viittaus C++:ssa

Tietorakenteet ja algoritmit

Sisältö. 2. Taulukot. Yleistä. Yleistä

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Tietotyypit ja operaattorit

Ohjelmoinnin perusteet Y Python

11/20: Konepelti auki

12. Näppäimistöltä lukeminen 12.1

Jakso 4 Aliohjelmien toteutus

Luento 4 Aliohjelmien toteutus

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Tietorakenteet ja algoritmit

8. Näppäimistöltä lukeminen 8.1

ITKP102 Ohjelmointi 1 (6 op)

Olio-ohjelmointi Syntaksikokoelma

8. Näppäimistöltä lukeminen 8.1

15. oppitunti. Taulukot. Osa. Mikä on taulukko?

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Jakso 4 Aliohjelmien toteutus

Sisältö. 22. Taulukot. Yleistä. Yleistä

Ohjelmoinnin perusteet Y Python

TIETORAKENTEET JA ALGORITMIT

Ohjelmoinnin peruskurssien laaja oppimäärä

Harjoitustyö: virtuaalikone

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

A TIETORAKENTEET JA ALGORITMIT

Ohjeet. AS C-ohjelmoinnin peruskurssi Aalto-yliopiston sahkotekniikan korkeakoulu Tentti , Raimo Nikkila

Algoritmit 2. Luento 2 To Timo Männikkö

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Sukupuu -ohjelma. Ossi Väre ( ) Joni Virtanen ( )

ITKP102 Ohjelmointi 1 (6 op)

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Taulukot. Jukka Harju, Jukka Juslin

Ohjelmoinnin perusteet Y Python

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

C-ohjelmointi, syksy 2006

C-ohjelmointi, syksy Yksiulotteiset taulukot Moniulotteiset taulukot Dynaamiset taulukot. Binääritiedostot. Luento

ITKP102 Ohjelmointi 1 (6 op)

Luennon sisältö. Taulukot (arrays) (Müldnerin kirjan luku 10) Yksiulotteiset taulukot. Mikä taulukko on? Taulukko-osoitin. tavallinen osoitin

ITKP102 Ohjelmointi 1 (6 op)

C-ohjelmointi: Osoittimet

1. Esittelyt ja vakiot 1.1 Esittelyt (declarations) Ennen nimen, tunnuksen (identifier) käyttöä se on

Tietorakenteet ja algoritmit

C-ohjelmointi Luento 5: Osoittimet Tiina Niklander

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus?

TAMPEREEN TEKNILLINEN YLIOPISTO

Tietueet. Tietueiden määrittely

Ohjelmoinnin peruskurssi Y1

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

Tietorakenteet ja algoritmit

Java-kielen perusteet

C++11 lambdat: [](){} Matti Rintala

Ohjelmoinnin peruskurssi Y1

4.2 Muistinhallintaa avustava kirjasto Tutnew

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

TAMPEREEN TEKNILLINEN YLIOPISTO

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Tutoriaaliläsnäoloista

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Algoritmit 1. Demot Timo Männikkö

JavaScript alkeet Esimerkkikoodeja moniste 2 ( Metropolia)

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Tutnew työkalu C++:n dynaamisen muistinhallinnan testaamiseen

C-ohjelmointi Luento 5: Osoittimet

Ohjelmoinnin jatkokurssi, kurssikoe

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Transkriptio:

C! Dynaaminen muisti 9.2.2017

Agenda Kertausta merkkijonoista Dynaaminen muisti Valgrind-perusteet ja esimerkkejä Seuraava luento to 2.3. Ei harjoituksia arviointiviikolla 13.2. 17.2. 2

Palautetta merkkijonoihin liittyen Mistä ne risuaidat tulevat? Loppunollat Strcat haluaa alustetun merkkijonon pohjalle stringien käsittelyyn tarkoitetut funktiot ovat täysin noituutta Merkkijonojen käsittely haastavampaa kuin Pythonilla C:ssä täytyy löytää ihan oma tapa ajatella vrt. esim pythoniin. mikä sinänsä ihan loogista, kun miettii miten "Tyhmä" kieli C on. 3

Yleisiä virheitä merkkijonoihin liittyen sizeof ja strlen sekoittaminen strlen: merkkijonon pituus merkkeinä olettaa char-taulukon joka päättyy nollamerkkiin (ajonaikainen) sizeof: muuttujan tarvitsema tila, osoittimille aina samaa kohdetyypistä riippumatta (käännösaikainen) 0-merkin unohtaminen merkkijonon lopusta Merkkijonon (tai muun taulukon) sijoittaminen = - operaattorilla Tarvitaan esim. strcpy() - funktio Merkkijonon vertailu loogisilla operaattoreilla Tarvitaan esim. strcmp() - funktio 4

Virtuaalimuistin rakenne mm. paikalliset muuttujat 0xFFFF FFFF FFFF FFFF Dynaamisesti varattu muisti Koodi ja vakiomerkkijonot 0x0000 0000 0000 0000 5

Pino ja pinokehys int multiply(int para, int parb) { int result = para * parb; return result; } void calc(int value) { int num = 10; int res = multiply(num, value); }.(aikaisemmat funktiot). 0x0004DA23 paluuosoite 20 value 10 num? res 0x0004D95A paluuosoite 10 para 20 parb 200 result Pinokehys (yksi jokaista funktiokutsua kohden) calc() multiply() 6

Miksi dynaaminen muisti? Pitkäikäinen data Funktion paikalliset muuttujat häviävät funktiosta poistuttaessa Tarvitaan N:lle alkiolle tilaa mutta koodausaikana ei tiedetä N:ää N voi vaihdella ohjelman aikana, voi kasvaa suureksikin Ei tulisi käyttää enempää muistia kuin tarvitaan Muistinkäsittelyvirheet joskus helpompi havaita Valgrind Pinossa virheelliset muistiviittaukset aiheuttavat hämmentäviä ongelmia 7

Dynaaminen muisti ja keko (heap) Ohjelma voi varata muistia dynaamisesti tarvitsemansa määrän void *malloc(koko) Vaihtuvanmittaiset tietorakenteet Ajon aikana luotavat tietorakenteet Dynaamisesti varattu muisti pitää vapauttaa käytön jälkeen Muistivuoto: vapauttamaton muisti vie resursseja järjestelmän muulta käytöltä Dynaamisesti varattu muisti säilyy vapauttamiseen asti Osoitinta voidaan välittää funktiolta toiselle 8

Malloc esimerkki: dynaaminen taulukko (n kokonaislukua) int funktio(int n) { int *table; // uninitialized at this point table = malloc(n * sizeof(int)); if (table == NULL) return -1; // memory allocation failed for (int i = 0; i < n; i++) { table[i] = n - i; } free(table); return 0; } table: 0 1 2 3 n 9

Malloc - esimerkki ja muistin alueet char *alloc_buffer(size_t n) { char *buffer; buffer = malloc(n); strncpy(buffer, "some text", n-1); // buffer = "jotain tekstiä"; -- olisi ongelma // tarvitaanko jotain muuta? } n Pino 100 Keko 0x82de Koodi (read-only) alloc_buffer{ } buffer 0x82de some text\0 malloc strncpy 10

void* -- tyypitön osoitinmuuttuja mallocin palauttamalla osoittimella ei ole tyyppiä Osoittimeen ei sellaisenaan voi viitata void* - osoitin voidaan sijoittaa tyypitettyyn osoittimeen Tämän jälkeen viittaukset, osoitinaritmetiikka, jne. toimivat (miksi ei muuten toimisi?) Osoittimen sijoitus tyypistä toiseen vaatii eksplisiittisen tyyppimuutoksen ( explicit type cast ) Yleensä kannattaa välttää (mutta joskus tarvitaan) char *buffer = malloc(n); int *buf_int = (int *) buffer; 11

Muistin vapauttaminen Funktiokutsu: free(void* osoitin) Viittaa dynaamisesti varatun muistilohkon ensimmäiseen osoitteeseen (eli siihen joka saatiin malloc:lla) Voidaan käyttää vain dynaamisesti varattuun muistiin Ja vain kerran / varattu muistilohko Turhaan varattu muisti on pois järjestelmän muulta käytöltä Ohjelman lopussa järjestelmä vapauttaa ohjelman käyttämät resurssit 12

Valgrind Kokoelma työkaluja ohjelman debugaukseen ja profilointiin Valgrind - analyysi tehdään ohjelman suorituksen aikana Tällä kurssilla keskitytään memcheck työkaluun, joka havaitsee muunmuassa seuraavia asioita: Virheelliset muistiviitteet Alustamattomien muuttujien epäilyttävä käyttö Muistivuodot Virheelliset muistin vapautukset memcpy, jne. funktioiden käyttö päällekkäisillä muistilohkoilla 13

Valgrind käyttö (pääsääntöisesti Linux) Ohjelma kannattaa kääntää g optiolla (mukaan tietoja ohjelmakoodin symboleista) Tehtäväprojektien makefilet sisältävät jo tämän Suoritus komentorivillä: valgrind ohjelma ohjelma : käännöksen tuloksena syntynyt tiedosto --leak-check=full optiolla saa enemmän tietoa muistivuodoista Tuottaa tulostetta ongelmakohdista ja niiden paikasta koodissa Usein toistuvia samankaltaisia ilmoituksia: aloita tarkastelu ja korjailu alkupään virheistä 14

Valgrind ja TIM Kierroksesta 5 lähtien tehtävät tarkastetaan myös Valgrindilla Jos Valgrind-virheitä, -50 % pisteistä Jos lisäksi varoituksia, -50 % pisteistä è molemmat: neljännes alkuperäisistä pisteistä Koodi saattaa tehdä näennäisesti oikeita asioita, mutta olla silti virheellinen Muistivuodot, virheelliset viittaukset 15

Valgrind: erilaisia muistivuotoja Valgrind luokittelee muistivuodot sen mukaan kuinka peruuttamattomasti muistilohko on kadonnut Definitely lost: varattuun lohkoon ei ole enää osoitinta ja sitä ei voi mitenkään vapauttaa Aiheuttaa virheen TMC-testeissä Indirectly lost / possibly lost: osoittimia vielä on, mutta ne eivät ole suoraan saatavillla Still reachable: muistia ei vapautettu, mutta osoitin siihen on vielä tallella, joten se voitaisiin vapauttaa Valgrind ja TMC ovat armollisia näiden suhteen 16