问题标签 [unsafe-pointers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
549 浏览

c# - 无法在 Visual Studio 2013 中使用不安全代码发布 WCF 服务

这可能与以下链接 Publish web application with unsafe code中提到的问题相同

我有一个带有不安全代码块的 wcf 服务。我在我的项目属性中允许不安全代码。应用程序能够在无法发布项目的地方正确构建。它说只有在发布项目期间编译时出现 /unsafe 错误,才会出现不安全代码。最后说构建失败。

我觉得它很奇怪,因为它能够成功构建项目但无法发布。

我尝试了以下帮助链接,但对我不起作用。

如何在基于 Web 的 asp.net 应用程序 c# 中添加不安全的关键字

0 投票
0 回答
614 浏览

swift - 如何在swift中安装回调函数

我正在尝试使用 DiskArbitration 并安装第一个回调函数,即 DADiskAppearedCallback,但我被困在 DARegisterDiskAppearedCallback 语句中,出现以下错误:

'DeviceManager' 不能转换为 'UnsafeMutablePointer<()>'

我需要将 DeviceManager 实例传递给回调,以便在其中填充数组...

这是我的代码:

提前感谢您的帮助。

0 投票
1 回答
5489 浏览

swift - 如果一个函数返回一个 UnsafeMutablePointer,我们有责任销毁和解除分配吗?

例如,如果我要编写这段代码:

...是否还需要执行以下操作?

还是我们没有分配内存,因此不需要关闭它?


更新#1:

如果我们想象一个返回 的函数UnsafeMutablePointer

调用这个函数会产生一个指向一个永远不会被销毁的对象的指针,除非我们自己做脏活。

我在这里问的问题:从呼叫中收到的指针有localtime()什么不同吗?
模拟器和操场都使我们能够向dealloc(1)返回的指针发送一个调用,但是我们应该这样做还是稍后会通过其他方法对返回的指针进行释放?

目前,我错误地认为我们确实需要销毁和解除分配。

更新 #1.1:

最后一个假设是错误的。我不需要释放,因为我没有创建对象。


更新#2:

我在 Apple 开发者论坛上收到了相同查询的一些答案。

一般来说,您的问题的答案是肯定的。如果您收到一个指向内存的指针,您将负责在 C 中释放它,那么您仍然有责任在从 swift 调用时释放它...... [但是]在这种特殊情况下,您无需执行任何操作。(JQ)

例程本身为结果维护静态内存,您不需要释放它们。(如果你这样做可能是一件“坏事”)......一般来说,你不知道是否需要释放 UnsafePointer 指向的东西......这取决于该指针从何处获得其值。(英石)

UnsafePointer 的 dealloc() 与 free() 不兼容。将 alloc() 与 dealloc() 和 malloc 配对。与免费()。如前所述,您正在调用的函数应该告诉您是否是您对释放结果的响应...... 只有当指针引用的内存中有非平凡的内容*时,destroy() 才是必需的,例如强引用或 Swift 结构或枚举。一般来说,如果它来自 C,你可能不需要 destroy() 它。(事实上​​,你可能不应该 destroy() 它,因为它不是由 Swift 初始化的。) ... * “非平凡的内容”不是 Swift 的官方术语。我将它与“平凡可复制”的 C++ 概念类比使用(尽管不一定是“平凡的”)。(STE)


最终更新:

我现在写了一篇博文,概述了我关于释放不安全指针的发现和假设,这些指针从 StackOverflow、Apple 开发论坛、Twitter 和 Apple 关于分配内存和释放它的旧文档(pre-ARC)获取板载信息。见这里

0 投票
1 回答
1169 浏览

ios - 'NSError' 在 Swift 中不能转换为 '@lvalue inout $T9'

所以我试图在我的 Swift iOS 应用程序中的 SLRequest 对象上使用 performRequestWithHandler 块,但我无法处理 NSError 对象。这就是我的代码的样子:

我有一个错误&error,上面写着:'NSError' is not convertible to '@lvalue inout $T9' in Swift。有谁知道那是什么意思?

先感谢您。

(我在 OS X 10.10 中使用 Xcode Beta 6 v7)

0 投票
1 回答
77 浏览

c# - 从运行时已知类型的二进制文件中读取值

我正在尝试从二进制文件中读取一系列值,但直到运行时我才知道值类型是什么。

简化示例

我有一个 10 字节长的二进制文件。字节依次表示 an int、 afloat和 a short。我在编译时不知道这一点,但在运行时我确实知道这一点,使用这样的数组:

问题

所以现在我有了这个列表,有没有办法可以使用这些信息快速读取文件中的值?我能想到的唯一方法是使用一个大块if,但它看起来真的很难看:

但这是丑陋和麻烦的。我想知道我是否可以使用数组中的Type信息types以某种方式“自动化”这个。

我试过的

我想到的一个想法是将原始字节读入数组,然后对字节数组执行转换。因此,假设我的数组如下所示:

这分别包含intfloatshort值 123456、123.456 和 12345。现在我可以执行以下操作:

这似乎运作良好,但有两个问题:

  1. 我不知道如何编组*ip回托管域。
  2. 我仍然无法使用我的类型列表,如下:

    /li>

这会在指示的行上产生两个编译时错误:

这就是我到目前为止所想尝试的。

我希望有人能帮帮忙。我觉得我错过了一些简单的东西,这会让我的生活更轻松。

更新

我已经尝试过 Peter Duniho 的建议,它似乎工作得很好,尽管与大块相比,性能影响很小if

以下是来自约 100 MB 文件的一些结果(所有时间都以毫秒为单位):

彼得的方法:

if堵塞:

没什么太重要的,尽管因为我计划处理大得多的文件(在 GB 范围内),所以这几百毫秒加起来,所以我将坚持使用丑陋的if块,直到我找到一样快的东西。

0 投票
1 回答
5848 浏览

ios - Swift UnsafeMutablePointer?> 分配和打印

我是 swift 新手,在处理非托管 CFString(或 NSString)的指针时遇到了一些困难。我正在开发一个 CoreMIDI 项目,该项目暗示使用 UnsafeMutablePointer?> 正如您在此函数中看到的那样:

我的问题是我想分配一个缓冲区来接收属性(_str)的内容然后调用上面的函数,最后使用println在控制台打印内容。

此刻我写了这个:

我没有在网上找到任何在苹果开发库上使用 CoreMIDI 函数的示例代码。我真的很困惑,因为我来自 cpp,而且 swift 的情况有很大不同。

编辑 :

在 Rintaro 和 Martin 回答后我仍然有问题,我所有的测试都是在 iOS 8.1 上完成的,如果我复制你带给我的代码,编译器会告诉我我不能写:

'Unmanaged' 的结果不能转换为 'MIDIObjectRef'。所以我添加了一个“&”,因为 MIDIObjectRef 是一个 UnsafeMutablePointer<void>。

现在:'Unmanaged<MIDIEndpoint>' 不能转换为 '@lvalue inout $T2'。最后我不得不将第一个 let 更改为 var,不明白为什么?!?

代码现在编译并运行,但 MIDIObjectGetStringProperty 返回 OSStatus err -50 对应于 IOW 或来自 MacErros.h :

所以看起来参数不是 MIDIObjectGetStringProperty 正在等待的参数。

我的 iPad 上确实存在源“0”,因为 MIDIGetNumberOfSources() 返回 1。这是完整的代码:

显示:

我真的什么都不懂...

更新 :

终于Martin找到了解决办法,看来32位和64位架构下MIDIObjectRef有两种不同的定义。当我在旧 iPad 2 上运行代码时,我的代码尝试在 32 位模式下编译,其中 MIDIGetSource(i) 返回值不能转换为 MIDIObjectRef。解决方案是在 32 位架构上“不安全地转换”midi 端点:

...或者购买新的 64 位设备 ...

感谢您的宝贵帮助

0 投票
1 回答
2171 浏览

ios - 如何从 CGFloat 数组创建 CIVector?

我正在尝试在 Swift 中创建 CICrossPolynomial 过滤器类型。

但是,我不确定如何创建语法来做到这一点。

文档指定了一个具有浮点数组的 CIVector?

但是我如何真正声明这样的 CIVector?有一个具有此签名的构造函数

但是当我尝试

我得到错误:

你知道我如何正确地创建一个带有 CGFloats 数组的 CIVector 吗?

0 投票
4 回答
384 浏览

c# - 为什么字符串指针位置不同?

为什么每次运行应用程序时字符串指针位置都不同,当我使用时,StringBuilder但在声明变量时却相同?

输出:

40907812
178488268

下次:

40907812
179023248

下次:

40907812
178448964

0 投票
2 回答
361 浏览

ios - 在 Swift 中从 NSData 读取时的 EXC_ARM_DA_ALIGN

我有以下课程:

我在我的 iOS 应用程序中使用它来读取具有自定义格式的二进制文件。例如,要读取Int偏移量 5 处的值,我使用:

let foo = rawData.read(5) as Int

这可以在我的 iPad Air 模拟器上运行,并且已经通过了 beta 测试的审查。但是,我的外部测试人员有 iPad 2s 和 4s,他们遇到了EXC_ARM_DA_ALIGN错误。

我无法更改输入文件的结构。有什么方法可以修复该read功能以确保对象是从正确对齐的内存位置构建的?

0 投票
1 回答
422 浏览

string - 将 UnsafeMutablePointer 与 String 或 Character 类型一起使用时的不一致

我目前正在尝试DynamicArray在 Swift 中实现我自己的数据类型。为此,我使用了一些指针。作为我的root我使用的UnsafeMutablePointer是泛型类型T

现在你可以看到我还实现了一个capacity属性,它告诉我当前分配了多少内存root。因此,可以创建一个DynamicArray使用init(capacity:)初始化程序的实例,它分配适当的内存量并设置capacity属性。
但后来我也实现了init(count:repeatedValue:)初始化程序,它首先使用init(capacity: count). 然后它将那部分内存中的每个段设置为repeatedValue.

当使用init(count:repeatedValue:)带有数字类型的初始化程序时IntDouble或者Float它工作得很好。然后使用Character, 或者String虽然它崩溃了。虽然它不会一直崩溃,但实际上有时可以通过编译几次来运行,正如可以在此处看到的那样。

为什么会这样?它是否与不同长度的值有关StringCharacter持有不同的值?


更新#1:

现在@AirspeedVelocity 用init(count:repeatedValue:). 但是,它DynamicArray包含另一个初始化程序,它最初的工作方式与init(count:repeatedValue:). 正如@AirspeedVelocity 所描述的那样,我将其更改为工作init(count:repeatedValue:)

我正在使用这里initializeFrom(source:)描述的方法。而且由于符合它应该可以正常工作。 我现在收到此错误:collectionCollectionType

这只是一个误导性的错误信息吗?