在内存分配包装器中无效使用不完整类型,只有GCC?

时间:2009-08-19 14:12:11

标签: gcc

我正在通过全局重载operator new等来追踪可能是内存泄漏的内容......这样做的代码在VC ++下编译得很好,但在GCC中引发了问题:

15: namespace std { class bad_alloc; };


16: 
17: void * operator new( size_t size ) throw ( std::bad_alloc );

18: void operator delete( void * p ) throw ();

19: void * operator new[]( size_t size ) throw ( std::bad_alloc );

20: void operator delete[]( void * p ) throw ();

抛出的错误是:

../zylibcpp/../zylibcpp/utility/MemoryTracker.hpp:17: error: invalid use of incomplete type ‘struct std::bad_alloc’
../zylibcpp/../zylibcpp/utility/MemoryTracker.hpp:15: error: forward declaration of ‘struct std::bad_alloc’
../zylibcpp/../zylibcpp/utility/MemoryTracker.hpp:19: error: invalid use of incomplete type ‘struct std::bad_alloc’
../zylibcpp/../zylibcpp/utility/MemoryTracker.hpp:15: error: forward declaration of ‘struct std::bad_alloc’

这里发生了什么?

3 个答案:

答案 0 :(得分:1)

异常规范中的类型应该是完整的。尝试包含定义异常类的 <memory> <new>标头。你包含的标题集似乎只是声明它,这是不够的。

答案 1 :(得分:1)

这是:

namespace std { class bad_alloc; };

在你自己的代码中?除了一些例外(没有双关语)你不能自己在std命名空间中声明事物。和bad_alloc声明 是不完整的。

答案 2 :(得分:1)

C ++标准(15.4)说throw子句中的类型必须是完整类型(因此你不能只是转发声明它)。它适用于MSVC,因为他们break from the standard并说throw(some_type)等同于throw(...)