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)
我知道直接编辑应该是不可变类型的字符串有点疯狂。
但我想问为什么它很危险,在什么情况下这会导致致命错误。
在每个假设字符串不变性的地方。例如
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)
这只是一个很快的问题。但是,破坏这种不变量通常可能会产生不可预测的后果,因为代码可能(并且将会)假设它得到满足。
实际上,这可能会起作用,但理论上,许多事情中的任何一个都可以出错
其中,1是最有可能出错的。