У меня есть кусок кода С ++ (в драйвере Windows, но это может быть не так важно для нашего обсуждения) в Visual Studio 2013 обновление 4неразрешенный внешний оператор удаления (Недействительными *)
У меня есть эта реализация распределителя:
class allocator {
public:
pointer allocate(size_type n, typename allocator<void, TAG>::const_pointer = 0) {
return static_cast<pointer>(::ExAllocatePoolWithTag(NonPagedPool, n*sizeof(value_type), tag()));
}
void deallocate(pointer p, size_type) {
::ExFreePoolWithTag(p, tag());
}
void construct(pointer p, value_type const& val) {
::new(p)value_type(val);
}
void destroy(pointer p) {
p->~value_type();
}
}
у меня есть базовый класс, который имеет определенный деструктор, который вызывает у меня ошибки компиляции для сценария:
struct A {
A(int i) : i(i) {
::DbgPrint("A::A");
}
~A() {
::DbgPrint("A::~A");
}
int i;
};
void Allocator_support_works_as_expected() {
allocator<A> alloc;
auto p = alloc.allocate(1);
alloc.construct(p, A(1));
alloc.destroy(p); // IF i comment this out it compiles, but no destructor called
alloc.deallocate(p, sizeof(A));
}
Я получаю следующее при попытке компиляции:
сообщение об ошибке:
error LNK2019: unresolved external symbol "void __cdecl operator delete(void *)" ([email protected]@Z) referenced in function "public: void * __cdecl A::`scalar deleting destructor'(unsigned int)" ([email protected]@[email protected])
В «уничтожить» реализацию я называю деструктор, потому что Распределитель использует размещение нового. Что происходит ?
EDIT 1
кажется, что для окон среды разработки драйвера нужен определить глобальный оператор новым, даже если в моем случае я не использую его
У меня есть вопросы о функции 'void' с' return 0; ' –
Какая версия Visual Studio? –
Вы '#include', чтобы убедиться, что перегрузки размещения-new 'operator new' и' operator delete' правильно объявлены? –