San*_*eal 12 c# pointers unsafe
我已经做了很多研究,但现在我仍然坚持为什么我仍然会遇到这个错误.我有一个具有以下属性的结构:
struct Account
{
//private attributes
private double mBalance;
private int mAccountNumber;
private string mName;
private string mDateCreated;
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试执行以下操作:
class BankManager
{
//private attributes
private unsafe Account *mAccounts;
private unsafe bool *mAccountsAvailable;
private int mNumberAccounts;
}
Run Code Online (Sandbox Code Playgroud)
即使将我的类帐户转换为结构,对类BankManager中的属性使用"unsafe",并告诉编译器它可以使用不安全的代码(在属性 - >构建中),我仍然会收到此错误
*mAccounts
Run Code Online (Sandbox Code Playgroud)
任何想法为什么?我很确定我在结构中使用的所有类型都是合法的,可以在c#中使用指针.提前致谢!
Han*_*ant 27
Account类中的字符串会导致此问题.要了解原因,您需要了解垃圾收集器的工作原理.它通过跟踪对象的引用来发现垃圾.mName和mDateCreated就是这样的引用.mBalance和mAccountNumber 不是,这些字段是值类型.而且,最重要的是,BankManager.mAccounts字段不是,它是一个指针.
因此编译器可以预先告诉垃圾收集器永远不会看到字符串引用.因为唯一的方法是通过mAccount字段而不是参考.
唯一可以解决的问题是严格限制自己的价值类型.对字符串执行此操作的唯一方法是使用Marshal.StringToCoTaskMemUni()将它们分配到非托管内存中,并将IntPtr存储在字段中.它现在从垃圾收集器无法触及,无法被它移动.你现在也有释放那个字符串的负担.
显然,这是不实际的,容易导致泄漏,这种问题在C程序中很常见.不知道你为什么要追求这个,但要记住,对象的引用已经是一个简单的指针,所以你自己不使用指针获得任何东西.
| 归档时间: |
|
| 查看次数: |
24791 次 |
| 最近记录: |