Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
"deklaracja": nie znaleziono pasującego operatora usuwania; pamięć nie zostanie zwolniona, jeśli inicjalizacja zgłasza wyjątek
Uwagi
Nowe umieszczanie jest używane, dla którego nie ma usunięcia umieszczania.
Gdy pamięć jest przydzielana dla obiektu z operatorem new, wywoływany jest konstruktor obiektu. Jeśli konstruktor zgłasza wyjątek, każda pamięć przydzielona dla obiektu powinna zostać cofnięto przydział. Nie można tego zrobić, chyba że istnieje funkcja operatora delete zgodna z operatorem new.
Jeśli używasz operatora new bez dodatkowych argumentów i kompilujesz z /GX, /EHs lub /EHa opcje, aby włączyć obsługę wyjątków, kompilator wygeneruje kod do wywołania operatora delete , jeśli konstruktor zgłosi wyjątek.
Jeśli używasz formy new umieszczania operatora (formularza z argumentami oprócz rozmiaru alokacji), a konstruktor obiektu zgłasza wyjątek, kompilator będzie nadal generować kod do wywołania operatora ; ale zrobi to tylko wtedy, gdy formularz umieszczania operatora deleteistnieje pasujący do formy umieszczania operatora deletenew , który przydzielił pamięć.
Example
Na przykład:
// C4291.cpp
// compile with: /EHsc /W1
#include <malloc.h>
class CList
{
public:
CList(int)
{
throw "Fail!";
}
};
void* operator new(size_t size, char* pszFilename, int nLine)
{
return malloc(size);
}
int main(void)
{
try
{
// This will call ::operator new(unsigned int) to allocate heap
// memory. Heap memory pointed to by pList1 will automatically be
// deallocated by a call to ::operator delete(void*) when
// CList::CList(int) throws an exception.
CList* pList1 = new CList(10);
}
catch (...)
{
}
try
{
// This will call the overloaded ::operator new(size_t, char*, int)
// to allocate heap memory. When CList::CList(int) throws an
// exception, ::operator delete(void*, char*, int) should be called
// to deallocate the memory pointed to by pList2. Since
// ::operator delete(void*, char*, int) has not been implemented,
// memory will be leaked when the deallocation cannot occur.
CList* pList2 = new(__FILE__, __LINE__) CList(20); // C4291
}
catch (...)
{
}
}
Powyższy przykład generuje ostrzeżenie C4291, ponieważ nie zdefiniowano formy umieszczania operatora delete zgodnego z formą umieszczania operatora new. Aby rozwiązać ten problem, wstaw poniższy kod powyżej głównego. Zwróć uwagę, że wszystkie przeciążone parametry funkcji operatora delete są zgodne z parametrami przeciążonego operatora new, z wyjątkiem pierwszego parametru.
void operator delete(void* pMem, char* pszFilename, int nLine)
{
free(pMem);
}