Zarządzanie pamięcią

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

Podstawy programowania komputerów

Lab 9 Podstawy Programowania

Microsoft Interface Definition Language

Wskaźniki. Informatyka

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

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:

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:

Podstawy programowania w języku C++

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

Adam Kotynia, Łukasz Kowalczyk

Programowanie w języku C++

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

DYNAMICZNE PRZYDZIELANIE PAMIECI

Zdarzenia (events, connection points)

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

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

Programowanie i struktury danych

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

Jak Windows zarządza pamięcią?

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

Tablice, funkcje - wprowadzenie

Tablice w argumentach funkcji. Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku

Programowanie obiektowe W3

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

Tworzenie aplikacji rozproszonej w Sun RPC

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Zdalne uruchamianie obiektów COM

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

Podstawy programowania w języku C++

Stałe, tablice dynamiczne i wielowymiarowe

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

Wykład 1: Wskaźniki i zmienne dynamiczne

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

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

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

4 bity zarezerwowane dla przyszłych zastosowań 11 bitów określających źródło błędu 16 bitów określających rodzaj błędu.

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Algorytmy i język C++

Obiekty w plikach wykonywalnych, marshaling

//////////////////////////////////////////////////////////// // Kalkulator (prosty) - wersja agregowalna import "unknwn.idl";

Structured storage, Monikers, Running Object Table

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Wskaźniki. Przemysław Gawroński D-10, p Wykład 1. (Wykład 1) Wskaźniki / 9

Zajęcia 6 wskaźniki i tablice dynamiczne

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

Typy danych. Przemysław Gawroński D-10, p lutego Wykład 1. (Wykład 1) Typy danych 25 lutego / 11

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

4. Tablica dwuwymiarowa to jednowymiarowa tablica wskaźników do jednowymiarowych tablic danego typu.

Deklaracja struktury w C++

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

Dzisiejszy wykład. Klasa string. wersja prosta wersja ze zliczaniem odwołań. Wyjątki Specyfikator volatile Semafory

dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! )

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Rekurencja (rekursja)

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Wstęp do programowania

Programowanie obiektowe i C++ dla matematyków

Serwery Statefull i Stateless

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

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

Języki i techniki programowania Ćwiczenia 2

ALGORYTMY I STRUKTURY DANYCH

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

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

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

PARADYGMATY PROGRAMOWANIA Wykład 3

Informatyka. Wy-08 Klasy. mgr inż. Krzysztof Kołodziejczyk

Technologie COM i ActiveX COM - Component Object Model

Wskaźniki w C. Anna Gogolińska

Wywoływanie metod zdalnych

Wywoływanie metod zdalnych

Języki i metody programowania I

Wprowadzenie do programowania w języku C

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

Programowanie współbieżne i rozproszone

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

76.Struktura oprogramowania rozproszonego.

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

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Zajęcia 6 wskaźniki i tablice dynamiczne

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Sun RPC/XDR. Dariusz Wawrzyniak 1

Henryk Budzisz. materiały przygotowane w ramach projektu ZPORR nr POKL /08-00

Podstawy programowania w języku C++

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

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

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

Sun RPC/XDR 10. listopada Dariusz Wawrzyniak (IIPP) 1

external Data Representation

Definicje klas i obiektów. Tomasz Borzyszkowski

Podstawy Programowania

Agregacja. Wykorzystanie innego komponentu bez użycia agregacji. Simple calculator. Extended calculator

Podstawy programowania w języku C++

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

zmienne stanowią abstrakcję komórek pamięci: programista może przechowywać dane w pamięci, nie martwiąc się o techniczne szczegóły (np.

Transkrypt:

System COM, aby mógł śledzić zmiany w alokacji pamięcią podczas wywołań, obsługuje pamięć niezależnie od Runtime Library (RT) C++ i korzysta ze sterty bieżącego procesu.

Do obsługi pamięci COM, zdefiniowany został interfejs IMalloc: interface IMalloc : IUnknown { void *Alloc([in] ULONG cb); void *Realloc ([in] void *pv, [in] ULONG cb); void Free([in] void *pv); ULONG GetSize([in] void *pv); int DidAlloc(void *pv); void HeapMinimize(void);

Zawiera on analogiczne metody do funkcji malloc(), realloc(), free(). Dodatkowo dostępne są metody GetSize() zwracająca rzeczywiście zaalokowany rozmiar pamięci, który jest nie mniejszy niż zarezerwowany metodą Alloc() lub Realloc(). Metoda DidAlloc() pozwala na sprawdzenie, czy wskazany obszar pamięci został zarezerwowany za pomocą metod interfejsu IMalloc. Metoda HeapMinimize() minimalizuje obszar sterty systemu COM, uwalniając dla systemu nieużywaną pamięć.

Wskaźnik do interfejsu IMalloc można uzyskać za pomocą funkcji CoGetMalloc(): IMalloc* pmalloc; CoGetMalloc(1, &pmalloc); System udostępnia również funkcje CoTaskMemAlloc(), CoTaskMemRealoc() i CoTaskMemFree(), które odwołują się do interfejsu IMalloc.

Podczas przekazywania parametrów do metod należy pamiętać, że w przypadku, gdy podczas wywołania spodziewamy się zmiany alokacji obszaru pamięci dla podanego argumentu następującego po różnych stronach interfejsu, to powinien on być zawsze alokowany przy użyciu interfejsu IAlloc: Parametr typu [in] jest alokowany i zwalniany przez klienta. Podsystem COM nie będzie próbował zmieniać alokacji pamięci, tak więc parametr tego typu może być rezerwowany dowolną metodą (new, malloc, IMalloc::Alloc()). Należy pamiętać, że metoda zwalniająca pamięć powinna odpowiadać tej, która ją rezerwowała (odpowiednio delete, free, IMalloc::Free()).

przekazany zostanie wynik operacji. W przypadku Dla parametru typu [out] przekazywany jest wskaźnik do istniejącej zmiennej, w której danych o zmiennym rozmiarze (łańcuchy tekstowe, wektory), odpowiedni obszar pamięci alokowany jest po stronie komponentu i zwalniany przez klienta. Do alokacji pamięci należy użyć alokatora IMalloc::Alloc() i zwalniająć pamięć IMalloc::Free().

Dla parametru typu [in,out] przekazywany jest wskaźnik do istniejącej zmiennej, która przechowuje argument dla komponentu. W przypadku danych o zmiennym rozmiarze (łańcuchy tekstowe, wektory) komponent może próbować przealokować lub zwolnić pamięć. Ostatecznie pamięć zwalniana jest przez klienta. Ze względu na możliwość zmiany alokacji pamięci przez komponent konieczne jest użycie alokatora IMalloc::Alloc() i zwalnianie pamięci za pomocą IMalloc::Free().

parametr [in] Klient Proxy RPC Stub Serwer Argument=new TYP(); f(argument); Argument 010010...101 CoTaskMemAlloc() Argument (kopia) f([in] TYPArgument){ // kod CoTaskMemFree() Argument (kopia) delete Argument; Argument

parametr [out] Klient Proxy RPC Stub Serwer TYP Wynik; f(&wyniki); &Wyniki CoTaskMemAlloc() &Wyniki (kopia) f([out] TYP Wynik){ CoTaskMemAlloc() Wynik[0] Wynik[1] 010010...101 CoTaskMemFree() &Wyniki (kopia) Wynik[2] CoTaskMemAlloc() Wynik[0] (kopia) Wynik[1] (kopia) CoTaskmemFree() CoTaskmemFree() Wynik[2] (kopia)

parametr [in,out] Klient Proxy RPC Stub Serwer TYP Zminenna; f(&zminenna); &Zminenna 010010...101 CoTaskMemAlloc() &Zmienna (kopia) f([in,out] TYP Zmienna){ CoTaskMemAlloc() Dana[0] Dana[1] CoTaskMemAlloc() Dana[0] (kopia) Dana[1] (kopia) CoTaskMemFree() CoTaskMemAlloc() NDana[0] NDana[1] CoTaskMemFree() CoTaskMemFree() CoTaskMemAlloc() NDana[0] (kopia) NDana[1] (kopia) NDana[2] (kopia) 010010...101 CoTaskMemFree() &Zmienna (kopia) CoTaskMemFree() NDana[0] NDana[1] NDana[2] NDana[2]

Do alokacji pamięci typu BSTR używane są metody SysAllocString(), SysReAllocStringLen() i SysFreeString(). Wewnętrznie używają one interfejsu IMalloc.

Przykład 1 interface IStringManipulator : IUnknown { HRESULT SetString([in, string] LPCSTR pstring); HRESULT SwapString([in, out, string] LPSTR* ppstring); HRESULT GetString([out, string] LPSTR* ppstring);

Przykład 1 Komponent: LPSTR mystring=null HRESULT CStringManipulator::SetString(LPCSTR pstring) { mystring=(lpstr)cotaskmemrealloc(mystring, strlen(pstring)+1); strcpy(mystring, pstring); HRESULT CStringManipulator:: SwapString(LPSTR* ppstring) { LPSTR tmpstr=*ppstring; *ppstring=mystring; mystring=tmpstr; HRESULT CStringManipulator::GetString(LPSTR* ppstring) { *ppstring=(lpstr)cotaskmemalloc(strlen(mystring)+1); strcpy(*ppstring, mystring);

Przykład 1 Klient: LPCSTR String1="Ala ma kota"; LPCSTR String2="Kot ma Ale"; pcomponent->setstring(string1); LPSTR UpdateString=(LPSTR)CoTaskMemAlloc(strlen(String2)+1); memcpy(updatestring, String2) pcomponent->swapstring(&updatestring);... CoTaskMemFree(UpdateString); LPSTR ReceiveString=NULL; pcomponent->getstring(&receivestring);... CoTaskMemFree(ReceiveString);

Przykład 2 interface IStringArrayManipulator : IUnknown { typedef struct { int Cout; [size_is(count)] LPSTR* Strings; StringArray; HRESULT SetStrings([in] StringArray StrArr); HRESULT SwapStrings([in, out] StringArray *pstrarr); HRESULT GetStrings([out] StringArray *pstrarr);

Przykład 2 Komponent: StringArray mystrarr; mystrarr.count=0; mystrarr.strings=null; HRESULT CStringArrayManipulator::SetString(StringArray StrArr) { for (int i=0;i<mystrarr.count;i++) CoTaskMemFree(myStrArr.Strings[i]); mystrarr.strings=(lpstr*)cotaskmemrealloc(strarr.count*sizeof(lpstr)); mystrarr.count=strarr.count; for (int i=0;i<mystrarr.count;i++){ mystrarr.strings[i]=(lpstr)cotaskmemalloc(strlen(strarr.strings[i])+1); strcpy(mystrarr.strings[i], StrArr.Strings[i]);

Przykład 2 Komponent: HRESULT CStringArrayManipulator:: SwapStrings(StringArray *pstrarr) { StringArray tmpstrarr=*pstrarr; *pstrarr=mystrarr; mystrarr=tmpstrarr; HRESULT CStringArrayManipulator::GetStrings(StringArray *pstrarr) { (*pstrarr).strings=(lpstr*)cotaskmemalloc(mystrarr.count*sizeof(lpstr)); (*pstrarr).count=mystrarr.count; for (int i=0;i<mystrarr.count;i++){ (*pstrarr).strings[i]=(lpstr)cotaskmemalloc((*pstrarr).strings[i], strlen(mystrarr.strings[i])+1); strcpy((*pstrarr).strings[i], mystrarr.strings[i]);