добрый день.
помогите прояснить неясные моменты касаемо следующего кода:
#include <iostream>
#include <cstddef>
using namespace std;
class myException
{
};
class CTest
{
int i;
public:
CTest()
{
throw myException(); //1.
printf("CTest object created ok!\n");
}
~CTest()
{
printf("CTest object destroyed ok!\n");
}
void *operator new(size_t size) throw (std::bad_alloc)
{
printf("allocating a CTest object...");
//throw std::bad_alloc(); //2.
void * res = NULL;
res = ::operator new(size);
if ( res )
printf("%p size %d... \n", res, (int) size);
return res;
}
void operator delete (void *p, size_t size)
{
printf("deallocating a CTest object %p size %d\n", p, (int)size);
::operator delete(p);
}
};
int main()
{
CTest *pCTest = NULL;
try{
pCTest = new CTest();
}
catch ( myException &)
{
printf("myException caught!!\n");
printf("pCTest %p\n", (void*)pCTest);
return -1;
}
catch ( std::bad_alloc )
{
printf("std::bad_alloc caught!!\n");
printf("unable to allocate CTest object\n");
}
printf("normal program flow\n");
printf("pCTest %p\n", (void*)pCTest);
delete pCTest;
return 0;
}
вариант, если строка //1 раскомментена, а строка //2 закомментена:
почему при срабатывании исключения в конструкторе класса далее неявно вызывается operator delete. как С++ система узнает, что несмотря на то, что создание объекта не произошло, память, выделенную под него явно посредством operator new, следует удалить, и это происходит автоматически сразу же после срабатывания исключения в конструкторе?
вариант, если строка //1 закомментена, а строка //2 раскомментена
почему при возбуждении исключения std::bad_alloc при выделении памяти под объект класса далее в ф-ции main не происходит вызов operator delete для этого класса несмотря на то, что операция удаления delete pCTest; прописана явно? в стандарте где-то оговорено, что при удалении NULL поинтера operator delete не будет вызываться?
шыбко не пинайте, это мое первое сообщение на этом форуме.
спасибо.
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс