C++ Garip Çıktı

#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?

Lokal variable’a pointer leak ediliyor.

1 Beğeni

(Kusura bakmayın internet bağlantımda sıkıntılar vardı biraz geç yazıyorum.)

Burda yanlışım ne ki? Hala anlamadım.

Omru biten objeye pointer dereference ediliyor.

		{
			Singleton singleton;
			singleton.value = 0;
			s_Instance = &singleton;
		}
		
		return *s_Instance;
1 Beğeni

Sanırım new kullanmalıydım.

Evet. static bir obje de kullanilabilir :slight_smile:

Bu arada thread-safe de degil ama bu noktada cok onemli olmadigini tahmin ediyorum.

1 Beğeni

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

Hm okuma/calisma konusu vermis oldum o zaman :slight_smile:

Ama kisaca kodun birden fazla thread tarafindan (“ayni anda”) kullanilabilmesi demek.

3 Beğeni