2012-05-03 28 views
3

以下代碼:爲什麼不能將跟蹤引用用作類成員?

ref class A 
{ 
private: 
    int% referenceToAnInt; 
}; 

產生在Visual Studio以下錯誤:

錯誤C3160: '詮釋%':一個管理類的數據成員不能有這種類型

我想跟蹤引用是一個託管的東西 - 爲什麼他們不能成爲託管類的成員? 另請參見:如何正確地在C++/CLI中存儲對值類型的引用?

+0

請嘗試一次提出一個問題。如果您有兩個不同的問題,請在兩個帖子中提問。 – svick

回答

4

CLR不允許將跟蹤引用存儲爲字段。另外,來自C++/CLI-Spec:

包含跟蹤參考的程序具有除自動以外的存儲持續時間 是不合格的。 (這就排除有跟蹤 引用作爲數據成員)。

我猜他們想避免,你保持一個參考長於引用對象的實際壽命的問題。另一種方法是使用wrapper ref類來保存值,或者委託讀取/寫入。

2

跟蹤參考「託管的東西」,這就是爲什麼你不能使用它們作爲類的成員。它們與C++ &引用類似,您可以使用它們在某些其他方法中引用局部變量。但是局部變量存儲在短期存儲器(又名堆棧)中。這意味着當包含該局部變量的方法結束時,引用將不再有效,但該對象可能仍然存在。

這不會是內存安全的,這就是爲什麼在.Net中禁止這樣做的原因。

+0

除非使用'/ clr:safe'開關來產生可驗證的輸出,否則C++/CLI不會強制執行安全性。 –

+0

C++/CLI沒有,但在這種情況下CLR。 – svick

相關問題