通过 unsafe_ 函数修改“String” - 有什么警告吗?

Gni*_*muc 3 julia

julia> x = "abcdefg"
"abcdefg"

julia> GC.@preserve x unsafe_store!(pointer(x), 'A', 1)
Ptr{UInt8} @0x0000000118532160

julia> x
"Abcdefg"
Run Code Online (Sandbox Code Playgroud)

我知道直接编辑应该是不可变类型的字符串有点疯狂。

但我想问为什么它很危险,在什么情况下这会导致致命错误。

Bog*_*ski 5

在每个假设字符串不变性的地方。例如

julia> x = "abcdefg"
"abcdefg"

julia> s = Set([x])
Set{String} with 1 element:
  "abcdefg"

julia> GC.@preserve x unsafe_store!(pointer(x), 'A', 1)
Ptr{UInt8} @0x000000000a3043a8

julia> push!(s, x)
Set{String} with 2 elements:
  "Abcdefg"
  "Abcdefg"
Run Code Online (Sandbox Code Playgroud)

这只是一个很快的问题。但是,破坏这种不变量通常可能会产生不可预测的后果,因为代码可能(并且将会)假设它得到满足。


Osc*_*ith 5

实际上,这可能会起作用,但理论上,许多事情中的任何一个都可以出错

  1. 更新不会发生,因为编译器决定将更新后发生的计算移至更新前
  2. 其他一些字符串被修改,因为编译器在两个字符串之间共享内存。
  3. 你被一种可怕的恐怖所诅咒。

其中,1是最有可能出错的。