Listing 7: Fixes the memory leak with auto_ptr

// destroy9.cpp
#include <stdio.h>
#include <memory>       // For auto_ptr
    
using namespace std;

class File
{
    FILE* f;

public:
    File(const char* fname, const char* mode)
    {
        f = fopen(fname, mode);
        if (!f)
            throw 1;
    }
    ~File()
    {
        if (f)
        {
            fclose(f);
            puts("File closed");
        }
    }
};

main()
{
    void f(const char*);
    try
    {
        f("file1.dat");
    }
    catch(int x)
    {
        printf("Caught exception: %d\n",x);
    }
}

void f(const char* fname)
{
    auto_ptr<File> xp = new File(fname,"r");
    puts("Processing file...");
    throw 2;
}

// Output:
Processing file...
File closed
Caught exception: 2
//End of File