无法获取地址,获取大小或声明指向托管类型的指针

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程序中很常见.不知道你为什么要追求这个,但要记住,对象的引用已经是一个简单的指针,所以你自己不使用指针获得任何东西.