奇怪的代码中断在MSVC中构建。这是什么意思?

时间:2011-01-21 08:43:25

标签: c++ visual-studio-2010 compiler-errors rapidxml

我正在尝试将rapidxml包含到我当前的项目中。但是,它不会构建。

Visual Studio会抱怨这段代码(rapidxml.hpp:419 + 451):

419: void *memory = allocate_aligned(sizeof(xml_attribute<Ch>));
420: xml_attribute<Ch> *attribute = new(memory) xml_attribute<Ch>;

编译器会说

  

rapidxml.hpp(420):错误C2061:语法错误:标识符'memory'

我有点看到这会如何混淆编译器。它实际上让我很困惑。 (memory) new(memory) xml_attribute<Ch>部分在那里做什么?

如果我删除了(memory)部分,那么编译就可以了 此外,gcc编译它只是包含(memory)

修改
哦,我用new重载了DEBUG_NEW来做一些内存调试。 DEBUG_NEW不支持展示位置。

4 个答案:

答案 0 :(得分:3)

这是我的建议。 “内存”本身也被定义为宏,并且正在扩展而导致问题。因此,搜索#define.memory(使用正则表达式)以查看内存是否定义为宏。

至于下一个陈述,这个表格:

new(allocator) ObjectType(...)
当您想使用自己的内存分配器为您分配内存时,使用

希望这有帮助。

答案 1 :(得分:3)

你有#include&lt; new&gt;在那个档案中?

答案 2 :(得分:1)

这称为“放置新”。它在memory中实例化xml_attribute的实例,而不是为它分配新的内存。参见:

http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10

我不确定为什么VC2010的语法有问题。

答案 3 :(得分:1)

语法new (pointer) type( argument )被称为 placement new ,它基本上代表了type构造函数对先前分配的内存中给定argument的调用pointer

语法尽可能正确。可能上面的几行有一个缺少的分号或语法错误,这使得解析器混乱,但memory作为标识符是在前一行中定义的correclty使用的。 (并且它不是由实施语言保留的)