Strange code breaks build in MSVC. What does it mean?
I am trying to include rapidxml into my current project. However, it would not build.
Visual Studio would complain about this piece of code (rapidxml.hpp:419+开发者_C百科451):
419: void *memory = allocate_aligned(sizeof(xml_attribute<Ch>));
420: xml_attribute<Ch> *attribute = new(memory) xml_attribute<Ch>;
The compiler would say
rapidxml.hpp(420): error C2061: syntax error : identifier 'memory'
And I kind of see how this would confuse the compiler. It actually confuses me quite a bit, too. What is the (memory)
part of new(memory) xml_attribute<Ch>
doing there?
If I delete that (memory)
part, it compiles just fine.
(memory)
included.
Edit:
Oh, and I overloadednew
with DEBUG_NEW
to do some memory debugging. DEBUG_NEW
does not support placement new.This is my suggestion. The "memory" itself is defined somewhere also as a macro, and is getting expanded which causes the problem. So search for #define.memory
(using regular expressions) to see if memory is defined as a macro.
As for the next statement, this form:
new(allocator) ObjectType(...)
is used when you want to use your own memory allocator to allocate memory for you.
Hope this helps.
Have you got #include <new> in that file?
This is called "placement new". It instantiates an instance of xml_attribute in memory
instead of allocating new memory for it. See:
http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10
I'm not sure why VC2010 has a problem with the syntax though.
The syntax new (pointer) type( argument )
is called placement new, and it basically represents a call to the type
constructor with the given argument
over the memory previously allocated in pointer
.
The syntax, in as much as it is shown, is correct. Maybe a couple of lines above there is a missing semi-colon or syntax error that is confusing the parser, but memory
as an identifier is correclty used defined in the previous line. (And it is not reserved by the language for the implementation)
精彩评论