toxide
1
#include <iostream>
class Singleton
{
private:
static Singleton* s_Instance;
public:
int value = 0;
static Singleton& Get()
{
if (!s_Instance)
{
Singleton singleton;
singleton.value = 0;
s_Instance = &singleton;
}
return *s_Instance;
}
void PrintValue()
{
value++;
std::cout << value << " ";
}
};
Singleton* Singleton::s_Instance = nullptr;
int main()
{
Singleton instance0 = Singleton::Get();
instance0.PrintValue();
instance0.PrintValue();
Singleton instance1 = Singleton::Get();
instance1.PrintValue();
instance1.PrintValue();
Singleton instance2 = Singleton::Get();
instance2.PrintValue();
instance2.PrintValue();
std::cout << std::endl;
std::cin.get();
}
Beklediğim çıktı 1 2 3 4 5 6
idi ama program 1 2 -858993459 -858993458 -858993459 -858993458
çıktısını veriyor. Hata nerede?
aib
2
Lokal variable’a pointer leak ediliyor.
1 Beğeni
toxide
3
(Kusura bakmayın internet bağlantımda sıkıntılar vardı biraz geç yazıyorum.)
Burda yanlışım ne ki? Hala anlamadım.
aib
4
Omru biten objeye pointer dereference ediliyor.
{
Singleton singleton;
singleton.value = 0;
s_Instance = &singleton;
}
return *s_Instance;
1 Beğeni
toxide
5
Sanırım new
kullanmalıydım.
aib
6
Evet. static
bir obje de kullanilabilir
Bu arada thread-safe de degil ama bu noktada cok onemli olmadigini tahmin ediyorum.
1 Beğeni
toxide
7
Evet öyle daha kolay olurdu ama böyle nasıl yapılabilir denemek istedim.
Yine tam olarak anlayamadım :\ thread-safe olmayan ne, thread-safe ne?
1 Beğeni
aib
8
Hm okuma/calisma konusu vermis oldum o zaman
Ama kisaca kodun birden fazla thread tarafindan (“ayni anda”) kullanilabilmesi demek.
3 Beğeni