[Python-Dev] Re: Proposal: C API Macro to decref and set to NULL
David Abrahams
dave at boost-consulting.com
Fri Jul 16 06:33:19 CEST 2004
Guido van Rossum <guido at python.org> writes:
>> [David Abrahams, on the Py_CLEAR macro]
>> > FWIW our experience in the C++ community suggests that
>> > deallocate-and-NULL tends to hide bugs. In general we prefer to use
>> > deallocate-and-fill-pointer-with-garbage. I'm not sure if the
>> > experience translates here, of course.
>
> [Tim]
>> I don't think so. Along with the macro, Jim checked in a nice
>> explanation in the Extending and Embedding manual. A decref can cause
>> anything to happen if the decref'ed containee is now trash, including
>> fresh accesses to the container object holding the now-trash containee
>> that was decrefed. If the container's pointer to the containee isn't
>> NULLed out first, the entire implementation of the container has to be
>> aware that this particular containee may hold an insane value. Ditto
>> if garbage is put in the pointer. Ditto for NULL too, but NULL is a
>> single, obvious, and easy-to-test way to say "and this containee no
>> longer exists". This isn't really so much about deallocation as about
>> horrid side effects triggered by deallocation.
>
> Plus, in many cases NULL is *already* an expected value.
>
> We even have macros like Py_XDECREF() that are NULL-aware.
That's exactly the sort of case that covers up bugs in C++.
Our operator delete basically just ignores NULL values. When people
write
delete p; p = 0;
It can cover up bugs where p is unintentionally getting deleted
twice. It might still not be applicable here, though.
--
Dave Abrahams
Boost Consulting
http://www.boost-consulting.com
More information about the Python-Dev
mailing list