Re: Using pointer-to-member of incomplete type in constructor call in VS2008
Mihajlo Cvetanovi=C4=87 wrote:
I made a minimal VS2008 project that compiles cleanly in Debug build =
but
reports Run-Time Check Failure #0 during execution. The problem is =
that
Data class is defined in one place and just declared in another. It
seems that sizeof(pointer-to-member) is different in these two cases. =
If
the order of includes is changed in Test.cpp OR in Configuration.cpp =
OR
there is #include "Data.h" instead of struct Data; in Configuration.h
then there is no stack corruption. Is this a known bug (or a bug at =
all)?
MSVC compiler implements an optimization whereby the size of a =
pointer-to-member depends on the complexity of the class hierarchy (off =
the top of my head, 4 bytes when only single inheritance is present, 8 =
with multiple inheritance, 12 with virtual inheritance and 16 to support =
incomplete classes).
This optimization is, technically, illegal. For one thing, the C++ =
standard says that if you reinterpret_cast a pointer-to-member to =
another unrelated pointer-to-member type and then back, the value should =
remain unchaged, which in practice means that all such types have to be =
the same size. Then there are cases like yours, where the same =
pointer-to-member type is used with incomplete class at one point in the =
program, and with complete class in another.
You can give the compiler a hint as to the complexity of your class, or =
turn off this optimization completely, with a compiler switch, a =
#pragma, or a special keyword. See
http://msdn.microsoft.com/en-us/library/yad46a6z.aspx
http://msdn.microsoft.com/en-us/library/83cch5a6.aspx
http://msdn.microsoft.com/en-us/library/ck561bfk.aspx
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not =
necessarily a good idea. It is hard to be sure where they are going to =
land, and it could be dangerous sitting under them as they fly overhead. =
-- RFC 1925