On tedy GC ignoruje vsechny promenne, na ktere ukazuje unsafe.Pointer? Nebo proste jen ignoruje ten unsafe.Pointer a klidne ty promenne dealokuje "pod rukama". Cekal bych to druhe
> On tedy GC ignoruje vsechny promenne, na ktere ukazuje unsafe.Pointer? Nebo proste jen ignoruje ten unsafe.Pointer a klidne ty promenne dealokuje "pod rukama".
Muj nazor je, ze ani jedno (ale v Go neprogramuji). Cekal bych, ze dokud unsafe.Pointer existuje (napr. nebyl uklizen pomoci GC), tak GC neuklidi to, na co ukazuje. Problem nastane ve chvili, kdy unsafe.Pointer prevedu na uintptr a prestanu pouzivat. Protoze uz ho nepouzivam, tak GC ho muze uklidit a uintptr je pro nej obycejne cislo, ktere nic referencovat nemuze. Takze, pokud uz nemam zadnou jinou zivou referenci na tu puvodni hodnotu, tak ji GC uklidi. A pokud ted k hodnote zacnu pristupovat pres adresu z uintptr, tak mam problem.
jj ve chvíli, kdy zkonvertuje unsafe.Pointer na uintptr a ta proměnná s unsafe.Pointerem přestane být viditelná, tak už ho nikdo nevlastní.
Ale je tady jedna méně známá věc - pokud se ta konverze provádí přímo při volání nativní funkce s předávání uintptr, tak tento vzor překladač rozezná a zařídí bezpečnou operaci. Budu se o tom muset příště zmínit, protože to je skutečně hodně corner case, ale nutnej, aby se dal bezpečně volat nativní kód.