недопустимое использование неполного типа в оболочке выделения памяти, только для GCC? - PullRequest
0 голосов
/ 19 августа 2009

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

1 голос
/ 19 августа 2009

Это:

namespace std { class bad_alloc; };

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

1 голос
/ 19 августа 2009

Стандарт C ++ (15.4) говорит, что тип в предложении throw должен быть полным типом (поэтому вы не можете просто объявить его вперед). Это работает в MSVC, потому что они выходят за рамки стандартного и говорят, что throw(some_type) эквивалентно throw(...).

1 голос
/ 19 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...