 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Roger Davis Guest
|
Posted: Sat Feb 19, 2005 3:47 am Post subject: C++ nothrow new() problem under Irix |
|
|
I am trying to use nothrow new() and am encountering what seems
to be a bug in the SGI/Irix C++ environment. The following
program runs OK under Solaris and Linux, but dumps core at the
delete[] statement under Irix. Is this really an SGI implementation bug,
or have I done something stupid? (Other than trying to use nothrow
new(), that is )
#include <new>
#include <stdexcept>
std::nothrow_t NoThrow;
class Junk {
public:
Junk();
~Junk();
};
Junk::Junk() {
(void) fprintf(stderr, "constrn"); (void) fflush(stderr);
}
Junk::~Junk() {
(void) fprintf(stderr, "destrn"); (void) fflush(stderr);
}
main() {
Junk *jnk;
if ((jnk= new(NoThrow) Junk[5]) == (Junk *) 0) {
(void) fprintf(stderr, "memory allocation errorn");
exit(-1);
}
delete[] jnk;
}
My debugger stack looks like this:
_kill()
_raise()
abort()
_array_pointer_not_from_vec_new()
__array_delete_general2()
__vec_delete2()
main() <---- stopped on the delete[] statement
If I use regular new() instead, i.e.,
jnk= new Junk[5];
then the delete[] works OK under Irix. Do I need to be using some
special form of delete[] to indicate that the new() was called with
nothrow? I have seen no documentation anywhere that indicates that
I should, but maybe I am not looking in the right places.
I also tried
float *f;
f= new(NoThrow) float[100];
delete[] f;
under Irix and that works OK. The problem seems to occur only when
using delete[] on a non-primitive.
Thanks!
--
Roger Davis
University of Hawaii/SOEST
[email]rbd (AT) NoSpamHere (DOT) hawaii.edu[/email]
|
|
| Back to top |
|
 |
David Anderson Guest
|
Posted: Sun Feb 20, 2005 11:47 pm Post subject: Re: C++ nothrow new() problem under Irix |
|
|
In article <cv6cse$4gp$1 (AT) news (DOT) hawaii.edu>,
Roger Davis <rbd (AT) planet10 (DOT) soest.hawaii.edu> wrote:
| Quote: | I am trying to use nothrow new() and am encountering what seems
to be a bug in the SGI/Irix C++ environment. The following
|
This is the subject of bug-id 862202.
(We added your report to that bug.)
Latest EDG front ends give a warning message about this
source code of yours, but we are not yet sure if this
warning is real or simply a mistaken (on our part)
integration of EDG front-end source.
I'm not a C++ language lawyer, but if I had to guess I'd guess
this is likely our bug, either in our runtime or our integration
of the EDG front end.
Sorry.
David Anderson [Not an official SGI spokesperson...]
PS: google 'nothrow new' to find the gotw (Guru Of
The Week) notes on nothrow. Before you use it too much :-)
PPS: IRIX CC has -LANG:exceptions=OFF to turn C++
into an older-style (before exceptions) so new returns 0
on failure. In IRIX virtual swap (like in Linux)
can mean malloc will succeed apparently but reference to
the memory can fail (Irrelevant Historical note: IRIX created
virtual swap before Linux had the concept).
|
|
| Back to top |
|
 |
Joseph Michaud Guest
|
Posted: Wed Feb 23, 2005 6:17 pm Post subject: Re: C++ nothrow new() problem under Irix |
|
|
In article <cv6cse$4gp$1 (AT) news (DOT) hawaii.edu>,
Roger Davis <rbd (AT) planet10 (DOT) soest.hawaii.edu> wrote:
| Quote: | I am trying to use nothrow new() and am encountering what seems
to be a bug in the SGI/Irix C++ environment. The following
program runs OK under Solaris and Linux, but dumps core at the
delete[] statement under Irix. Is this really an SGI implementation bug,
or have I done something stupid? (Other than trying to use nothrow
new(), that is )
#include
#include
std::nothrow_t NoThrow;
class Junk {
public:
Junk();
~Junk();
};
Junk::Junk() {
(void) fprintf(stderr, "constrn"); (void) fflush(stderr);
}
Junk::~Junk() {
(void) fprintf(stderr, "destrn"); (void) fflush(stderr);
}
main() {
Junk *jnk;
if ((jnk= new(NoThrow) Junk[5]) == (Junk *) 0) {
(void) fprintf(stderr, "memory allocation errorn");
exit(-1);
}
delete[] jnk;
}
My debugger stack looks like this:
_kill()
_raise()
abort()
_array_pointer_not_from_vec_new()
__array_delete_general2()
__vec_delete2()
main() <---- stopped on the delete[] statement
If I use regular new() instead, i.e.,
jnk= new Junk[5];
then the delete[] works OK under Irix. Do I need to be using some
special form of delete[] to indicate that the new() was called with
nothrow? I have seen no documentation anywhere that indicates that
I should, but maybe I am not looking in the right places.
I also tried
float *f;
f= new(NoThrow) float[100];
delete[] f;
under Irix and that works OK. The problem seems to occur only when
using delete[] on a non-primitive.
|
This may be an issue with unsupported placement array new on
an older compiler.
Please provide the compiler/linker versions, and the c++_eoe
and compiler_eoe versions, and the compile/link command.
And the IRIX OS version (just because).
Joe
--
------------------------------------------------------------------------
Joseph Michaud - SGI Apps Eng 978-562-8894 x483-8894 [email]jmichaud (AT) sgi (DOT) com[/email]
|
|
| Back to top |
|
 |
Roger Davis Guest
|
Posted: Fri Feb 25, 2005 12:20 am Post subject: Re: C++ nothrow new() problem under Irix |
|
|
| Quote: | Please provide the compiler/linker versions, and the c++_eoe
and compiler_eoe versions, and the compile/link command.
|
% CC -version
MIPSpro Compilers: Version 7.3.1.3m
% ld -V
ld32: INFO 153: Version 7.30.
c++_eoe 7.3.1.3m
compiler_eoe 7.3.1.3m
% CC -o junk -g junk.cc
% ./junk
constr
constr
constr
constr
constr
Abort (core dumped)
| Quote: | And the IRIX OS version (just because).
|
eoe IRIX Execution Environment, 6.5.16m
(Thanks for looking into this, Joe.)
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|