我正在通过全局重载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’
这里发生了什么?
答案 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(...)
。