Kezdőoldal » Számítástechnika » Programozás » C# memóriakezelés hogy is?

C# memóriakezelés hogy is?

Figyelt kérdés

Honnan tudom egy változónak mi a memóriacíme?

Ezt hogy tudom beolvasni, ill. módosítani.


Angol nyelvű leírást nyelvtudás hiányában nem sikerült teljesen megérteni. Valaki tud jó könyvet/cikket/videót erről ha esetleg ilyen nincs leírná? 17f


2018. dec. 9. 17:24
1 2
 1/19 anonim ***** válasza:

.NET-ben ez nem teljesen így megy, a runtime (illetve garbage collector) bármikor átrakhatja az objektumodat.


De nézz utána a fixed kulcsszónak:

[link]

2018. dec. 9. 17:27
Hasznos számodra ez a válasz?
 2/19 A kérdező kommentje:
Szóval ezt inkább c++ ban kellene megoldanom?
2018. dec. 9. 17:42
 3/19 anonim ***** válasza:
Mármint mit kell megoldanod?
2018. dec. 9. 17:47
Hasznos számodra ez a válasz?
 4/19 A kérdező kommentje:
Igazából semmit csak gyakorlás, ha ilyesmit kellene csinálnom Cheat Engine-t használnék..
2018. dec. 9. 18:04
 5/19 anonim ***** válasza:
És hogy jön a cheat engine a C#-hoz?
2018. dec. 9. 18:18
Hasznos számodra ez a válasz?
 6/19 anonim ***** válasza:
C++-ban sem tudod egyszerűen megoldani, mert a modern operációs rendszerek biztonsági okokból nem engednek csak úgy hozzáférni a fizikai memóriához, csak egy virtulis leképezéséhez. Ha mégis ilyesmit akarsz, akkor először is a "shared memory" foglamának nézz utána, illetve, hogy ténylegesen hogyan is kezeli az os a memóriát.
2018. dec. 9. 18:45
Hasznos számodra ez a válasz?
 7/19 anonim ***** válasza:

"Honnan tudom egy változónak mi a memóriacíme?"

Ha egy változódnak a memóriabeli címét kell lekérdezned, kénytelen vagy unsafe blokkot használni:

int i = 5;

unsafe {

.. int* i = &i;

}

Vagy ha már a metódusod paraméterei is pointer típusú adatot kérnek be, vagy pointer típusú visszatérési értéke van, az adott metódust unsafe kulcsszóval kell ellátnod:

private static unsafe int* DoSomething(int* A, int* B) {

...

}

Ha a kódod unsafe blokkot vagy metódust tartalmaz, a fordító alapértelmezetten nem fogja lefordítani és hibát fog rá írni - tehát külön be kell állítanod, hogy ezt használni tudd. Ha parancssorból fordítasz, akkor így teheted meg:

csc.exe /unsafe /out:MyAssembly.exe MySource.cs

Visual Studio-ban a Project -> [Projekt neve] Properties -> Build -> Allow unsafe code jelölőnégyzetet kell bepipálnod.


DE! Ez nagyon jó okkal van ilyen bonyolultan megoldva, mert nagyon-nagyon ritka esetekben van ilyenre szükséged. Alapesetben a .NET futtatókörnyezet nyilvántartja neked a változóidat és az általad létrehozott objektumaidat, így azokat a szemétgyűjtögető (garbage collector) fel tudja szabadítani, ha nincs rá hivatkozás. Pointerek esetében erre nem képes, tehát innentől teljesen a te kezedben múlik, hogy az általad lefoglalt memóriaterületeket felszabadítsd. Éppen ezért nagyon veszélyes tud lenni, mert elég egy kis figyelmetlenség és rögtön kész a memóriaszivárgás (memory leak - ha nem szabadítasz fel valamit, amire már nincs szükséged).


Általában unsafe kódra akkor szokott szükség lenni, ha natív kódot kell meghívnod, amit mondjuk C-ben vagy C++-ban írtak meg és nem tudod a .NET-es típusokat marshaling-gal egyeztetni a natív típusokkal.


Minden más eset megoldható pointerek nélkül is, amire be lettek vezetve a ref és az out kulcsszavak is - ha például két változó értékeinek felcserélésére akarsz egy metódust:

public void Swap(ref int A, ref int B) {

.. int Temp = A;

.. A = B;

.. B = Temp;

}

int First = 5;

int Second = 6;

Swap(ref First, ref Second);


Ha pedig egy metódusod két eredményt is vissza akar adni:

public void SumAndSub(int A, int B, out Sum, out Sub) {

.. Sum = A+B;

.. Sub = A-B;

}

int Sum, Sub;

SumAndSub(5, 6, out Sum, out Sub);

2018. dec. 9. 21:32
Hasznos számodra ez a válasz?
 8/19 anonim ***** válasza:

"egy változónak mi a memóriacíme"

#7-es válaszoló jól írja, de tegyük hozzá, hogy ez a virtuális memóriában lévő címet jelenti, nem a fizikai címet. Nem igazán világos, hogy neked melyik kell, valószínűleg a virtuális, az viszont processzenként egyedi, tehát minden processz úgy látja a saját címtartományát, mintha csak ő használná azt, és ez van leképezve több lépésben (sw és hw) fizikai címekké. Nem véletlen, hogy a CE is kernel modult használ ehhez.

2018. dec. 10. 07:18
Hasznos számodra ez a válasz?
 9/19 A kérdező kommentje:
Szerintem ezt kerestem
2018. dec. 10. 21:56
 10/19 A kérdező kommentje:
2018. dec. 10. 21:56
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!