V
Virchanza
I've been looking through the Dinkumware reference manual and I
can't find a form of "new" that doesn't throw any exceptions at all.
I'm currently writing a program that uses the "new" operator to do
stuff like create thread objects and window objects. If a thread
object or window object can't be created, my program displays a
message box, something like "Creation of the Help dialog box failed".
Ideally it would be:
Thread *const p = new(std::nothrow) Thread(my_entry_function,
JOINABLE);
if (!p)
{
wxMessageBox("Can't create thread");
return;
}
The problem with this however, is that don't want any exceptions at
all to be thrown by the "new" operator. For instance, the following
"Hello World" program doesn't work:
#include <new>
#include <iostream>
class MyClass {
public:
MyClass()
{
throw 5;
}
};
int main()
{
MyClass *p = new(std::nothrow) MyClass();
std::cout << "Hello World!\n";
}
The "nothrow" only stops "new" from throwing a "bad_alloc" if the
memory allocation fails -- it doesn't suppress exceptions thrown from
the constructor of the object. (Or at least that's the GNU C++
behaviour).
Is the following my only option?
int main()
{
MyClass *p;
try { p = new MyClass(); } catch(...) { p = 0; }
std::cout << "Hello World!\n";
}
can't find a form of "new" that doesn't throw any exceptions at all.
I'm currently writing a program that uses the "new" operator to do
stuff like create thread objects and window objects. If a thread
object or window object can't be created, my program displays a
message box, something like "Creation of the Help dialog box failed".
Ideally it would be:
Thread *const p = new(std::nothrow) Thread(my_entry_function,
JOINABLE);
if (!p)
{
wxMessageBox("Can't create thread");
return;
}
The problem with this however, is that don't want any exceptions at
all to be thrown by the "new" operator. For instance, the following
"Hello World" program doesn't work:
#include <new>
#include <iostream>
class MyClass {
public:
MyClass()
{
throw 5;
}
};
int main()
{
MyClass *p = new(std::nothrow) MyClass();
std::cout << "Hello World!\n";
}
The "nothrow" only stops "new" from throwing a "bad_alloc" if the
memory allocation fails -- it doesn't suppress exceptions thrown from
the constructor of the object. (Or at least that's the GNU C++
behaviour).
Is the following my only option?
int main()
{
MyClass *p;
try { p = new MyClass(); } catch(...) { p = 0; }
std::cout << "Hello World!\n";
}