开发者

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.

Also, gcc compiles it just fine with (memory) included.

Edit:

Oh, and I overloaded new 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)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜