c# - 使用指针添加功能以重置数组内的值
问题描述
我正在编写一个允许重用已定义数组的内存的程序。数组用初始数据初始化,可以修改。在我们决定需要重新使用内存之后,我们的想法是将数组恢复到其初始原始值。我想到的想法是使用指向数组中每个元素的指针,以便在需要时将它们恢复为以前的值。但由于某种原因,它并没有做到这一点。
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
使用扩展方法声明另一个数组,它会破坏前一个数组的指针。似乎它只有效,如果我们曾经使用过一次该方法,这基本上意味着没有任何效果。
解决方案
推荐阅读
- angular - 使用 Videogular 2 禁用搜索
- mysql - 在 laravel 的子查询中使用 count 编写 where 子句
- angular - Angular 4 在 @ViewChild 上使用 setter
- mysql - Liferay MySQL 通过 ssh 连接
- c - 如何从C中的文本文件中读取参数
- xamarin.forms - Xamarin Android - Java 在 VSTS 中内存不足,但在我的机器上没有
- excel - 一个 Excel 单元格中的多个 IF 函数
- android - BLE 在应用程序之外禁用配对
- selenium - Selenium-IDE 打开操作不解释变量
- sql-server - 错误消息:“消息 206,级别 16,状态 2,第 1 行操作数类型冲突:int 与日期不兼容”