The following is not the code that's giving you trouble. It can't be
compiled. I tried compiling your code for five minutes, then gave up.
On Apr 16, 2:43 pm, mpho <tjab...@[EMAIL PROTECTED]
> wrote:
> This seems straightforward but gives this runtime error: terminate
> called after throwing an instance of 'std::bad_alloc' , what() :
> std9bad_alloc .
std::bad_alloc is thrown when new cannot allocate the requested amount
of memory.
> I have:
>
> class X {
> int sz;
> T *ptr;
>
> public:
> X(int s, T *p) : sz(s), ptr(new T[s])
> {
> assert(ptr != NULL);
That assertion will always succeed, because new never returns NULL,
unless you explicitly request that behavior with 'nothrow' version of
new:
ptr(new (std::nothrow) T[s])
> for (int i = 0, i < sz; i++)
Replace that comma with a semicolon.
> ptr[i] = p[i];
> }
>
> //other members
>
> ~X() { delete ptr; ptr = NULL; }
That's undefined behavior: you must use delete[] when you use new[].
Additionally, setting ptr to NULL is completely unnecessary, right?
The object is about to die. Who will ever reference ptr?
Surely, you did not give out the address of or a reference to it to
your callers...
> };
>
> class Y {
> X xobj
A semicolon missing.
>
> public:
> Y(int s, T *p) : xobj(s, p) { } //OK?
That's OK.
> //other members
> ~Y() { } //OK?
That's OK too.
> };
>
> then
>
> int main(){
>
> ar[10] = {ten values};
> Y yobj(10, ar); //problem here(?)
No, there is no problem there. The problem is in the code that you did
not show, including the definition of T.
Lastly, I recommend that you become familiar with the standard
containers like std::vector. You will notice that your resource
owner****p headaches will vanish. :)
Ali
--
[ See http://www.gotw.ca/resources/clcm.htm
for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]


|