C#不安全代碼和stackalloc


stackalloc 關鍵字用於不安全的代碼上下文中,以便在堆棧上分配內存塊。如下:

int* block = stackalloc int[100];

注意:關鍵字僅在局部變量的初始值中有效。 下面的代碼導致編譯器錯誤。

int* block;
// The following assignment statement causes compiler errors. You
// can use stackalloc only when declaring and initializing a local 
// variable.
block = stackalloc int[100];

由於涉及指針類型,因此 stackalloc 要求不安全上下文。 有關更多信息,請參見 不安全代碼和指針(C# 編程指南)

stackalloc 類似於 C 運行庫中的 _alloca

以下代碼示例計算並演示 Fibonacci 序列中的前 20 個數字。 每個數字是先前兩個數字的和。 在代碼中,大小足夠容納 20 個 int 類型元素的內存塊是在堆棧上分配的,而不是在堆上分配的。

該塊的地址存儲在 fib 指針中。 此內存不受垃圾回收的制約,因此不必將其釘住(通過使用 fixed)。 內存塊的生存期受限於定義它的方法的生存期。 不能在方法返回之前釋放內存。

class Test
{
    static unsafe void Main()
    {
        const int arraySize = 20;
        int* fib = stackalloc int[arraySize];
        int* p = fib;
        // The sequence begins with 1, 1.
        *p++ = *p++ = 1;
        for (int i = 2; i < arraySize; ++i, ++p)
        {
            // Sum the previous two numbers.
            *p = p[-1] + p[-2];
        }
        for (int i = 0; i < arraySize; ++i)
        {
            Console.WriteLine(fib[i]);
        }

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/*
Output
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
*/

不安全代碼的安全性低於安全替代代碼。 但是,通過使用 stackalloc 可以自動啟用公共語言運行時 (CLR) 中的緩沖區溢出檢測功能。 如果檢測到緩沖區溢出,進程將盡快終止,以最大限度地減小執行惡意代碼的機會。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM