Placement new and destructor

Discussion in 'C++' started by dragoncoder, May 10, 2006.

  1. dragoncoder

    dragoncoder Guest

    Hello all,

    I am reading C++ Primer 3rd edition by Lippman & Lajoie and come across
    the following piece of code as an example demostrating the use of
    placement new.

    Section 8.4.5 (Page 417-418)

    #include <iostream>
    #include <new>

    const int chunk = 16;

    class Foo {
    public:
    int val() { return _val; }
    Foo() { _val = 0; }
    private:
    int _val;
    };

    char *buf = new char[sizeof (Foo) * chunk];

    int main() {
    Foo *pb = new (buf) Foo;
    if ( pb.val() == 0 )
    cout << "new expression worked!" << endl;
    delete[] buf;
    return 0;
    }

    Looking at the above code, I feel it is incorrect at 2 places.

    1. Since pb is a pointer to a Foo object, the expression inside the if
    condition should have been pb->val() instead of pb.val(), okay that may
    be a printing mistake.

    2. The second error is not a typographical error. I see at no place in
    the code the destructor of the Foo object is called. Instead delete[]
    buf calls the destructors of 16 char objects which is fine but I feel
    there should be a call to Foo's destructor before the delete[] buf.
    Shouldn't there be a call to pb->~Foo() before delete[] ?

    Please tell me, if I am missing something as this book is rated highly
    recommended at accu.org.

    Thanks
     
    dragoncoder, May 10, 2006
    #1
    1. Advertisements

  2. dragoncoder

    wij Guest

    I think you are correct.

    int main() {
    Foo *pb = new (buf) Foo;
    //if ( pb.val() == 0 ) // the new above will throw if failed
    // so this test always yields false
    cout << "new expression worked!" << endl;
    pb->~Foo() // yes, destruct *pb
    delete[] buf;
    return 0;
    }
     
    wij, May 10, 2006
    #2
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.