2015-03-24 2 views
1

У меня есть кусок кода С ++ (в драйвере 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

кажется, что для окон среды разработки драйвера нужен определить глобальный оператор новым, даже если в моем случае я не использую его

+4

У меня есть вопросы о функции 'void' с' return 0; ' –

+2

Какая версия Visual Studio? –

+1

Вы '#include ', чтобы убедиться, что перегрузки размещения-new 'operator new' и' operator delete' правильно объявлены? –

ответ

0

Убедитесь, что нет глупой ошибки, такой как

"c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86 
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\vc\bin\cl.exe" /EHsc /nologo /W4 test.cpp 

Я случайно установили условия для другой версии MSVC и мне потребовалось 15 минут, чтобы понять, где проблема

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