![]() |
1
13
注释行是什么 掩蔽 由CreateArray引起的错误。把它注释掉会暴露这个错误。但不管怎样,虫子还是存在的。 规范明确规定:
createArray函数分配一个块,您存储一个指向该块的指针,该块被丢弃,现在您有一个指向垃圾块的指针。你是 必修的 到 从不存储指向stackalloc'd块的指针 以便在块无效后可以访问存储。如果需要存储对块的引用,则堆分配该块,完成后请记住取消分配。 记住,在不安全的代码中 你必须完全理解 一切 关于托管内存模型。 一切 . 如果您不了解有关托管内存的所有信息,请不要编写不安全的代码。 这就是说,让我们来讨论一下您更大的困惑,即“什么时候必须修复内存才能获得指针?”答案很简单。 如果并且仅当它是可移动存储器时,您必须修复存储器。 固定将可移动记忆转化为不可移动记忆; 这就是修复的目的 . 你只能取不动的东西的地址;如果你取了不动的东西的地址并且它移动了,那么显然地址是错误的。您需要确保在获取内存地址之前内存不会移动,并且需要确保在再次移动内存地址之后不使用该地址。 |
![]() |
2
1
stackalloc在调用堆栈上分配一些空间,当您向上移出当前上下文级别(例如,离开一个方法)时,该空间就会丢失。您的问题是,当stackalloc在一个方法中时,当您离开该方法时,该堆栈的区域就不再是您可以使用的了。 所以,如果你这样做:
“东西”只在foo中有效,一旦你离开foo,堆栈就被卷回,这意味着如果你这样做:
然后当您离开allocate方法时,allocate的返回值就变成垃圾,这意味着“stuff”没有任何意义。 |
![]() |
3
1
你的假设部分正确,但理解错误。下面是一个引文 from this MSDN page :
有些语句将自动在堆栈上分配变量(即方法内的值类型),其他语句将需要使用
堆栈分配的内存在方法结束后被丢弃,因此是您的问题(请参阅EricLippers的回答,谁在我之前写了这个)。 |
![]() |
Terio · Typescript:使用变量的值创建自定义类型 2 年前 |
![]() |
Kareem Adel · 创建函数类型(TypeScript接口) 3 年前 |
![]() |
MatÄj VondráÄek · 如何在c#方法中传递类型? 3 年前 |
![]() |
kreo · 为什么&[T]参数也接受&Vec? 7 年前 |
![]() |
Jiji · 将简单对象强制转换为简单的通用接口 7 年前 |