"delete" asserts in debug build, multiple inheritance (msvc 7.1)
Note: cross-posted [comp.lang.c++] and [microsoft.public.vc.language].
Feel free to set follow-ups as appropriate (I don't know at this point).
<code>
struct Foo
{
virtual ~Foo() {} // Seemingly works without this destructor.
};
template< typename T >
struct Wrapper: T, Foo
{
Wrapper(): T() {}
virtual ~Wrapper() {} // This destructor doesn't seem to matter.
};
struct Naughty
{
//virtual ~Naughty() {} // Seemingly works with this destructor.
};
int main()
{
typedef Wrapper<Naughty> X; // This is irrelevant.
X* p = new X;
delete p; // !!! Blows up with MSVC 7.1 debug build.
}
</code>
<build>
cl /nologo /GX /GR /MDd main.cpp
</build>
<effect>
A big bad Bill-Box pops up, saying that there's DAMAGE: after block so
and so (the allocated block). Debugger lands on line 1165 in [dbgheap.c],
but evidently that box is produced by 1151, which at least matches the text.
This is, naturally, in function _free_dbg, called after destructors have
run successfully (at least, that's what I believe).
</effect>
Some help would be nice. The fixes indicated above makes the problem go away.
However, the original code that this example is condensed from, can't rely on
class Naughty having a virtual destructor (or rather, it can require that, but
it would be a little impractical, almost offensive, since no logical reason?).
Help, please,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?