<div dir="ltr"><div>After doing some testing I looked up the implementation and <font face="monospace, monospace">Unmanaged</font> it is very misleading in how it is behaves and is implemented.</div><div><br></div><div>When you call <font face="monospace, monospace">toOpaque()</font> it returns the result of <font face="monospace, monospace">unsafeBitCast(_value, to: UnsafeRawPointer.self)</font>. <font face="monospace, monospace">_value</font><font face="arial, helvetica, sans-serif"> is an internal field we can&#39;t directly access, in your case it is the </font><font face="monospace, monospace">c</font><font face="arial, helvetica, sans-serif"> object passed in.</font></div><div><br></div><div>So it seems like it isn&#39;t returning a proper <font face="monospace, monospace">UnsafeRawPointer</font> struct.</div><div><br></div><div>If you change your <font face="monospace, monospace">let c = C()</font> into <font face="monospace, monospace">var c = C()</font> you can call</div><div><br></div><div><font face="monospace, monospace">withUnsafeMutablePointer(to: &amp;c) { unsafeMutablePointer in</font></div><div><font face="monospace, monospace">    print(unsafeMutablePointer)</font></div><div><font face="monospace, monospace">    print(<span style="font-size:12.800000190734863px">rawPointer)</span></font></div><div><font face="monospace, monospace">}</font></div><div><br></div><div>It will print out different values for the 2 pointers even though they should be the same. If you test with <font face="monospace, monospace">withUnsafePointer(to:_:)</font> it will give the closure pointer same address as the <font face="monospace, monospace">unsafeMutablePointer</font> here.</div><div><br></div><div>If you need an UnsafeMutablePointer&lt;C&gt; you will need to do something like this (the pointer passed in is only considered valid for the lifetime of the closure):</div><div><br></div><div><font face="monospace, monospace">let pointer = withUnsafeMutablePointer(to: &amp;c) {</font></div><div><font face="monospace, monospace">    return UnsafeMutablePointer&lt;C&gt;($0)</font></div><div><font face="monospace, monospace">}</font></div><div><br></div><div><font face="arial, helvetica, sans-serif">If you are fine to use the </font><font face="monospace, monospace">UnsafeRawPointer</font><font face="arial, helvetica, sans-serif"> from </font><font face="monospace, monospace">toOpaque()</font><font face="arial, helvetica, sans-serif">, you can convert it back into </font><font face="monospace, monospace">c</font><font face="arial, helvetica, sans-serif"> with:</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="monospace, monospace">Unmanaged&lt;C&gt;.fromOpaque(rawPointer).takeUnretainedValue()</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="arial, helvetica, sans-serif">Hopefully this helped a bit.</font></div><div><font face="monospace, monospace"><br></font></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Sep 23, 2017 at 4:44 PM, Michael Ilseman via swift-users <span dir="ltr">&lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
&gt; On Sep 23, 2017, at 3:44 AM, nyg nyg via swift-users &lt;<a href="mailto:swift-users@swift.org">swift-users@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; Hello all,<br>
&gt;<br>
&gt; I&#39;m trying to get an UnsafeMutablePointer from an<br>
&gt; UnsafeMutableRawPointer obtained using the Unmanaged structure:<br>
&gt;<br>
&gt; class C { var foo = 42, bar = &quot;bar&quot; }<br>
&gt; let c = C()<br>
&gt;<br>
&gt; let rawPointer = Unmanaged.passUnretained(c).<wbr>toOpaque()<br>
&gt;<br>
<br>
</span>I believe that the object “c” is effectively dead from this point onwards. Did you try putting a use of c later on to guarantee its lifetime? E.g. add a `dump(c)` at the bottom of your script?<br>
<div class="HOEnZb"><div class="h5"><br>
&gt; let pointer = rawPointer.bindMemory(to: C.self, capacity: 1)<br>
&gt; let pointee = pointer.pointee<br>
&gt; print(pointee.foo) // EXC_BAD_ACCESS<br>
&gt;<br>
&gt; Here&#39;s some LLDB output, which looks strange to me as everything seems<br>
&gt; alright in pointer until I ask for its pointee:<br>
&gt;<br>
&gt; (lldb) frame variable -L c<br>
&gt; scalar: (memtest2.C) c = 0x0000000101d00030 {<br>
&gt; 0x0000000101d00040: foo = 42<br>
&gt; 0x0000000101d00048: bar = &quot;bar&quot;<br>
&gt; }<br>
&gt; (lldb) frame variable -L rawPointer<br>
&gt; 0x00000001005e2e08: (UnsafeMutableRawPointer) rawPointer = {<br>
&gt; scalar: _rawValue = 0x0000000101d00030 {<br>
&gt; 0x0000000101d00040: foo = 42<br>
&gt; 0x0000000101d00048: bar = &quot;bar&quot;<br>
&gt; }<br>
&gt; }<br>
&gt; (lldb) frame variable -L pointer<br>
&gt; 0x00000001005e2e10: (UnsafeMutablePointer&lt;<wbr>memtest2.C&gt;)<br>
&gt;                                            pointer = 0x0000000101d00030<br>
&gt; (lldb) frame variable -L pointer._rawValue<br>
&gt; scalar: (memtest2.C) pointer._rawValue = 0x0000000101d00030 {<br>
&gt; 0x0000000101d00040: foo = 42<br>
&gt; 0x0000000101d00048: bar = &quot;bar&quot;<br>
&gt; }<br>
&gt; (lldb) frame variable -L pointee<br>
&gt; 0x00000001005e2e18: (memtest2.C) pointee = 0x00000001005b65d8 {<br>
&gt; 0x00000001005b65e8: foo = 140736790071664<br>
&gt; 0x00000001005b65f0: bar = &quot;&quot;<br>
&gt; }<br>
&gt;<br>
&gt; I&#39;ve also tried assumingMemoryBound(to:) or simply doing:<br>
&gt;<br>
&gt; let pointer = UnsafePointer&lt;C&gt;(bitPattern: Int(bitPattern: rawPointer))!<br>
&gt; print(pointer.pointee.foo) // EXC_BAD_ACCESS<br>
&gt;<br>
&gt; But I always get this EXC_BAD_ACCESS error. What is going on here?<br>
&gt;<br>
&gt;<br>
&gt; Thanks for your help,<br>
&gt; Nick<br>
&gt; ______________________________<wbr>_________________<br>
&gt; swift-users mailing list<br>
&gt; <a href="mailto:swift-users@swift.org">swift-users@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-users</a><br>
<br>
______________________________<wbr>_________________<br>
swift-users mailing list<br>
<a href="mailto:swift-users@swift.org">swift-users@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-users</a><br>
</div></div></blockquote></div><br></div>