Everybody should know by now that you have to free memory using the same allocator that you used to allocate the memory. If you allocate with
new then you have to free with
delete; if you allocate with
LocalAlloc then you have to free with
Once you've internalized this rule, you can use it to draw other logical conclusions. Consider:
When I call the
PropertySheetfunction, who is responsible for freeing the memory that was allocated for the
phpagefield of the
Well, there are two candidates for this responsibility, either the
PropertySheet function or the caller of the
PropertySheet function. If the
PropertySheet function was responsible for freeing the memory, it would have to make sure to use the same allocator that was used to allocate the
phpage. But there is no requirement that that memory use any particular allocator. (In fact, a significant portion of the time, the memory is allocated from the stack, in which case there is no explicit deallocation step.) The
PropertySheet function would now be required to be psychic and somehow "know" how the memory should be freed (or whether it should be freed at all). Since psychic powers have yet to be perfected in software, this pretty much closes off this line of reasoning.
The only remaining candidate is the caller of the
PropertySheet function. Since that's the code that allocated the memory, it's the one who knows how to free it.