2010-07-27 26 views
5

Bu yasadışı/tehlikeli midir?Statik Değişken İşaretçi?

int* static_nonew() 
{ 
    static int n = 5; 
    return &n; 
} 

derleyici onunla bir sorun var gibi görünmüyor, ama başkası bellek gerektiğinde üzerine gelen korunmuş işaretçi konumu kendisidir?

DÜZENLEME: Bu soruyu neden sorduğumu açıklayan bir açıklama. Not: C++ ile programlama yapıyorum, C olarak etiketledim çünkü C++ sorusundan daha fazla C gibi görünüyordu.

Statik bir harita döndürmesi gereken bir dersim var. Sadece bu harita üzerinde bir kere başlatılmış olmasını istiyorum, çünkü birden çok kez yapılmasına gerek yok. Geçiş sınıfları yapıcı geçişler kendisini eklersiniz

static std::map<std::string, Transition*> transitions; 
static Transition trans1(transitions, ...); 
static Transition trans2(transitions, ...); 
return &transitions; 

: Bu nedenle, böyle bir şey var olacaktı. Bu şekilde, geçişleri bir kere oluşturacak ve onlara bir işaretçi getirecektir. Ben sadece yığın üzerinde tahsis edilen bir değişkene bir referans oluşturursanız, çok kolay üzerine yazılabilir ve "güvensiz" olduğunu hatırlıyorum. Bir işlev içinde yaratılan statik değişkenlerin tam olarak nasıl işlediği ile kafam karışmıştı.

+0

Haritanızın istemci kodu tarafından değiştirilmesi beklenmiyorsa, bir const referansı veya const'e bir işaretçi döndürmeniz gerekir. Bu, statik verilerle ilişkili risklerin çoğunu ortadan kaldıracaktır. –

cevap

5

Bu geçerli bir kod ve yararlı.

Böyle bir çok tektonik fabrika inşa edilmiştir.

6

Bu, statik bir değişkenin işaretçisine bir işlevdir. Bu konuda yasadışı bir şey yok. Kendinden başka herhangi bir statik veri türünden daha tehlikeli değildir.

Fakat statik veriler:

  1. genellikle zayıf tasarımın bir işaretidir ince hatalar için fırsat yaratır sıkı kavrama
  2. sepetleri yeniden entrancy oluşturur
  3. çok kullanılması gerektiğini doğruluk

Statik depolama sınıf değiştirici, işlemin ömrü boyunca bu değişken için belleğin ayrılacağı anlamına gelir. geçtiğiniz takdirde

+0

+1: çok iş parçacıklı problemlerden bahseden tek cevap (yeniden giriş) – smerlin

+0

+1: Bu yasadışı değil, ama çok tehlikeli. – Puppy

-1

herhangi hafıza konumu gösteren bir işaretçi iade ettikten sonra, int* static_nonew()

samimiydim varsayarsak, o zaman bu bellek üzerine yazılabilir, C. hiçbir koruma garantileri,

Ayrıca orada Bu işaretçi free için, davranış tanımsızdır, bu nedenle bazen tamam olur ve bazen çekirdek çeker. Diğer taraftan bu tamamen yasal bir koddur. Ayrıca, bir kez başlatmanız gereken bazı struct için int yerine ve oldukça kullanışlı bir deyim.

+0

"Bazen iyi olacak" çok yanıltıcıdır. ** Görünüyor olsa bile, "Tamam", muhtemelen tehlikeli bellek bozulması var. –

+0

@R .. Tüm cümleyi okuyabiliyor musunuz? Çekirdek-çöplük diyorsa bunun tehlikeli olduğunu ima ettiğini düşünüyorum. Ve davranış UNDEFINED olduğu için bazen hiçbir yan etkisi olmaz. –

1

Yasaldır, ancak yalnızca bir geçiş örneğine sahip olduğunuzu ve main() 'un statik olarak bildirildiğinden önce oluşturulacağını unutmayın. Küresel bir değişkene sahip olmak gibi.