Buffered Files & Associative Arrays
Brad Roberts
braddr at puremagic.com
Tue Jan 22 23:15:46 PST 2008
In 2.x you can probably make it safe by declaring the key as invariant.
I haven't actually tried it to see how well it works out, but in
concept that's how keys ought to behave.
Later,
Brad
Unknown W. Brackets wrote:
> At the end of the day, you still need to have some tracking of memory
> management. It's just not as complicated as with C/C++.
>
> That is, someone still "owns" the data. In this case, it's the stream.
> The stream may change this data (since it owns it) which will screw you
> up unless you copy it.
>
> This is actually not copy on write. But, copy on write would make the
> stream functions very slow since they would constantly be allocating
> memory while reading...
>
> -[Unknown]
>
>
> Michael wrote:
>> Wow, yeah I think that's pretty unfortunate. I haven't done much D
>> coding, and was only tangentially aware of the copy-on-write nature of
>> D arrays (which I think is the underlying cause of this bug/feature...?)
>>
>> This seems to seriously violate the principle of least surprise: I
>> strongly suspect that most non-D programmers would make the same
>> assumption I did. It's one thing when you're passing around a bunch of
>> char*'s; but this is a full featured string class!
>>
>> Chalk it up to the pains of learning D if you want, but I'm not
>> confident I won't make this mistake numerous times (resulting in
>> potentially strange and hard-to-solve bugs) before getting it straight
>> in my head, which is very frustrating... :(
>>
>> bearophile Wrote:
>>
>>> Unknown W. Brackets:
>>>> As it happens, the problem is the way you are abusing File's buffer.
>>>> You're taking the line, and using it... where the stream is
>>>> overwriting that space with new data.
>>> Yes, D is rather unsafe in that regard. To avoid this kind of bugs I
>>> add a "bool copy=true" as a template parameter (constant at compile
>>> time) to all my classes that return iterable objects then manage lot
>>> of data. So by default they perform the copy, and you avoid that
>>> whole class of bugs. When you know what you are doing and you want to
>>> go faster (sometimes 10 times faster) accepting a bit less safe code,
>>> you set that copy flag to false, and it keeps using the same buffer.
>>> I think the Phobos can grow such extra parameter in its iterable
>>> objects to avoid such kind of bugs.
>>>
>>> Bye,
>>> bearophile
>>
More information about the Digitalmars-d
mailing list