Да, любые уже выделенные объекты будут удалены. Почему бы не попробовать сами?
#include <iostream>
#include <stdexcept>
class A {
static int n;
public:
A()
{
++n;
std::cout << "construncting A no. " << n << "...";
// let's pretend we allocate something here
// with new and it fails
if (n == 5) {
std::cout << std::endl;
throw std::bad_alloc();
}
std::cout << "done\n";
}
~A()
{
--n;
std::cout << "destructed A no. " << n << "\n";
}
};
int A::n = 0;
int main()
{
try {
A* a = new A[10];
}
catch (std::bad_alloc& e) {
std::cout << "caught an exception!\n";
}
}
Однако деструктор экземпляра, который выкинул конструктор, НЕ будет вызван (это можно увидеть, если запустить код выше). Тем не менее, элементы, которые были построены к этому моменту, будут удалены. Например, если этот конструктор выдает:
class foo {
int i;
bar* b;
public:
foo() : i(42), b(new bar)
{
float f = 3.14;
// something throws an exception here
}
~foo()
{
delete b;
}
};
i
, b
и f
будут удалены, однако выделенная память не будет освобождена (delete b
не вызывается), и у вас будет утечка памяти (использование умных указателей приведет к легко решить это).
Посмотрите на C ++ FaqLite для получения дополнительной информации об этом:
http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.10
http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.8