2009-08-19 4 views
0

Я выслеживая, что может быть утечка памяти глобально перегрузки оператора новый и т.д ... код, чтобы сделать так, отлично компилируется под 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’ 

Что здесь происходит?

ответ

1

Тип спецификации исключения должен быть полным. Попробуйте включить заголовок <memory> <new>, который определяет класс исключения. Множество заголовков, которые вы включаете, похоже, просто объявляет об этом, чего недостаточно.

1

Является ли это:

namespace std { class bad_alloc; }; 

в собственном коде? За некоторыми исключениями (без каламбура) вы не можете сами объявлять вещи в пространстве имен std. И объявление bad_alloc является неполным.

1

В стандарте C++ (15.4) указано, что тип в предложении throw должен быть полным (поэтому вы не можете просто его объявить). Он работает в MSVC, потому что они break from the standard и говорят, что throw(some_type) эквивалентен throw(...).

Смежные вопросы