【问题标题】:How to work with memory I did not allocate如何使用我没有分配的内存
【发布时间】:2014-02-12 22:27:24
【问题描述】:

是否可以在 C# 中使用我未分配的内存?或者是否可以更改已创建数组的大小(但未分配内存)?

这是我的解决方案。这是更好的方法吗?

using System.Runtime.InteropServices;

class LengthOfArray
{
    public int Length;
}

[StructLayout(LayoutKind.Explicit)]
class MyArray
{
    [FieldOffset(0)]
    public LengthOfArray LengthOfArray;

    [FieldOffset(0)]
    public byte[] Array = new byte[4];
}

internal class Program
{
    private static void Main(string[] args)
    {
        var arr = new MyArray();
        arr.LengthOfArray.Length = 1024;
    }
}

以及如何最好地用字符串做类似的效果?

【问题讨论】:

  • 除非你使用unsafe。您的代码根本不会影响数组;数组是引用类型。
  • CLR 的存在是为了防止你做这样的事情。
  • 了解您实际想要完成的工作可能会有所帮助,因为这似乎是一个非常糟糕的设计选择 (XY problem)。
  • 你可以使用动态数组——比如 Collection;这些类型可以预先分配到某个大小 - 并且它们会动态扩展(在后台,新的 Collection 被创建为更大的大小 + 一些未来的大小,旧的 Collection 被复制到新的 Collection.
  • @dvnrrs 我没有在我的任何项目中使用此代码,我想学习语言功能。

标签: c# memory memory-management


【解决方案1】:

这并不像你认为的那样:

[FieldOffset(0)]
public byte[] Array = new byte[4];

这会将指向数组的指针放置在偏移量为零的位置。它没有将 4 个元素放在那里。

I cannot tell you what you should do because I don't know what you want to accomplish. 如果您需要一个可变大小的结构,请使用您想要的任何方法(Marshal.AllocHGlobal 或固定的byte[])分配一个字节块。

【讨论】:

    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2013-02-24
    • 2011-09-16
    • 1970-01-01
    • 2018-04-02
    相关资源
    最近更新 更多