简体   繁体   中英

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+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.

你在那个文件中有#include <new>吗?

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM