首页 > 解决方案 > 使用指针添加功能以重置数组内的值

问题描述

我正在编写一个允许重用已定义数组的内存的程序。数组用初始数据初始化,可以修改。在我们决定需要重新使用内存之后,我们的想法是将数组恢复到其初始原始值。我想到的想法是使用指向数组中每个元素的指针,以便在需要时将它们恢复为以前的值。但由于某种原因,它并没有做到这一点。

public struct MemoryOptimizer
    {
        public static MemoryBlock[] memoryBlocks = new MemoryBlock[10000];
        public static int counter = 0;

        public static void ResetToOriginalValues()
        {
            memoryBlocks.AsParallel().ForAll((element) =>
            {
                if (element != null)
                    element.Revert();
            });
        }
    }

    public static class Extensions
    {

        public static unsafe int* MemoryParse(this string s)
        {
            int parsedValue = Int32.Parse(s);
            int* ptr = &parsedValue;
            MemoryOptimizer.memoryBlocks[MemoryOptimizer.counter++] = new MemoryBlock()
            {
                pointerToCurrentValue = ptr,
                fallbackValue = *ptr
            };
            return ptr;
        }
    }
    public unsafe class MemoryBlock
    {
        public int* pointerToCurrentValue;
        public int fallbackValue;

        public void Revert()
        {
            unsafe
            {
                *pointerToCurrentValue = fallbackValue;
            }
        }
    }

我的主要方法:

static void Main(string[] args)
{
    string a = "1";
    string b = "2", c = "3", d = "4";

    unsafe
    {
        int* ga = b.MemoryParse();
        *ga = 449494;
        int*[] array = new int*[] { a.MemoryParse(), b.MemoryParse(), c.MemoryParse(), d.MemoryParse() };
        foreach (int* asd in array)
        {
            Console.Write(*asd + ",");
        }
        Console.WriteLine();
        *array[0] = 123;
        *array[1] = 444;
        *array[2] = 4151;
        *array[3] = 1895;
        foreach (int* asd in array)
        {
            Console.Write(*asd + ",");
        }
        Console.WriteLine();
        MemoryOptimizer.ResetToOriginalValues();
        foreach (int* asd in array)
        {
            Console.Write(*asd + ",");
        }
    }
}

不仅数组中的值不正确,而且在我调试之后,似乎在填充数组时所有指针都指向同一个地址。变量的地址ga没问题,如果我操纵它,它就可以工作,并且将它重置为其原始值MemoryOptimizer.ResetToOriginalValues()也可以。

尽管如此,所有这些array都不起作用。

编辑:如果我们完全删除数组,并int使用扩展方法声明另一个数组,它会破坏前一个数组的指针。似乎它只有效,如果我们曾经使用过一次该方法,这基本上意味着没有任何效果。

标签: c#pointersmemory-management.net-corereference

解决方案


推荐阅读