#include <iostream>
#include <vector>
#include <boost/shared_array.hpp>
#include <boost/scoped_array.hpp>
#include <boost/shared_ptr.hpp>
#include <sstream>
 
#define TRACE(T) std::cout << __PRETTY_FUNCTION__ << " " << __FILE__ << " " << __LINE__ << " " << (T) << " " << std::endl;
 
class classe1
{
    public:
 
        classe1();
 
        classe1(const classe1 &);
 
        virtual ~classe1();
 
        classe1 & operator=(const classe1 &);
 
    private:
 
        char * data;
};
 
classe1::classe1()
{
    TRACE("");
    std::string s("je suis une instance de classe1");
    data = new char[s.size()+1];
    snprintf(data, s.size()+1, "%s", s.c_str());
}
 
classe1::classe1(const classe1 &c):data(NULL)
{
    TRACE("");
    *this = c;
}
 
classe1::~classe1()
{
    TRACE("");
    delete[] data;
}
 
classe1 & classe1::operator=(const classe1 &c)
{
    TRACE("");
    if (this != &c)
    {
        TRACE("");
        delete[] data;
        if (c.data == NULL)
        {
            data = NULL;
        }
        else
        {
            data = new char[strlen(c.data)+1];
            snprintf(data, strlen(c.data)+1, "%s", c.data);
        }
    }
    return(*this);
}
 
class classe2 : public classe1
{
    public:
 
        classe2();
 
        classe2(const classe2 &);
 
        virtual ~classe2();
 
        classe2 & operator=(const classe2 &);
};
 
classe2::classe2()
{
    TRACE("");
}
 
classe2::classe2(const classe2 &c)
{
    TRACE("");
    *this = c;
}
 
classe2::~classe2()
{
    TRACE("");
}
 
classe2 & classe2::operator=(const classe2 &c)
{
    TRACE("");
    if (this != &c)
    {
        *(classe1 *)this = c;
    }
    return(*this);
}
 
void foo()
{
    TRACE("classe1 c1;");
    classe1 c1;
 
    TRACE("classe1 c2(c1);");
    classe1 c2(c1);
 
    TRACE("c2 = c1;");
    c2 = c1;
 
    TRACE("classe1 c3 = c1;");
    classe1 c3 = c1;
 
    TRACE("c1 = c1;");
    c1 = c1;
 
    TRACE("classe2 c4;");
    classe2 c4;
 
    TRACE("classe2 c5(c4);");
    classe2 c5(c4);
 
    TRACE("c5 = c4;");
    c5 = c4;
 
    TRACE("classe2 c6 = c4;");
    classe2 c6 = c4;
 
    TRACE("c4 = c4;");
    c4 = c4;
}
 
void foo2()
{
    int  tab_int[10];
    for (int idx=0; idx<10; ++idx)
    {
        tab_int[idx] = idx;
    }
    for (int idx=0; idx<10; ++idx)
    {
        TRACE(tab_int[idx]);
    }
    std::fill(tab_int, tab_int+10, 10);
    for (int idx=0; idx<10; ++idx)
    {
        TRACE(tab_int[idx]);
    }
    std::fill(tab_int, tab_int+10-1, 9);
    for (int idx=0; idx<10; ++idx)
    {
        TRACE(tab_int[idx]);
    }
}
 
template<class T1, class T2>
void foo3()
{
    TRACE("");
 
    // Allocations classiques
    int _nb_max_in_out=3;
    int _max_frame_size=2;
    T1 ** p_in2 = new T1 *[_nb_max_in_out];
    T1 ** p_out2 = new T1 *[_nb_max_in_out];
    T2 * sizein2 = new T2 [_nb_max_in_out];
    T2 * sizeout2 = new T2 [_nb_max_in_out];
 
    // Surveillance des allocations par boost
    // pour eviter les fuites memoires
    boost::scoped_array<T1*> p_in22(p_in2);
    boost::scoped_array<T1*> p_out22(p_out2);
    boost::scoped_array<T2> sizein22(sizein2);
    boost::scoped_array<T2> sizeout22(sizeout2);
    std::vector<boost::shared_array<T1> > vv;
    boost::shared_array<T1> buffer;
 
    for (int idx=0; idx<_nb_max_in_out; ++idx)
    {
        // Allocations classiques
        p_in2[idx] = new T1[_max_frame_size];
        p_out2[idx] = new T1[_max_frame_size];
        sizein2[idx] = _max_frame_size;
        sizeout2[idx] = _max_frame_size;
 
        // Surveillance des allocations par boost
        // pour eviter les fuites memoires            
        buffer.reset(p_in2[idx]);
        vv.push_back(buffer);
        buffer.reset(p_out2[idx]);
        vv.push_back(buffer);
    }
 
    // On peut desormais ne plus se soucier de la liberation memoire
    // c'est boost qui s'en chargera a la sortie du scope quelle que
    // soit la maniere dont on en sortira : exception, return, ...
}
 
template<class T1, class T2>
void foo4()
{
    TRACE("");
 
    // Allocations classiques
    int _nb_max_in_out=3;
    int _max_frame_size=2;
    T1 ** p_in2 = new T1 *[_nb_max_in_out];
    T1 ** p_out2 = new T1 *[_nb_max_in_out];
    T2 * sizein2 = new T2 [_nb_max_in_out];
    T2 * sizeout2 = new T2 [_nb_max_in_out];
    for (int idx=0; idx<_nb_max_in_out; ++idx)
    {
        // Allocations classiques
        p_in2[idx] = new T1[_max_frame_size];
        p_out2[idx] = new T1[_max_frame_size];
        sizein2[idx] = _max_frame_size;
        sizeout2[idx] = _max_frame_size;
    }
    try
    {
        // Executer du code complexe avec de multiples points
        // de sortie (return)
 
        // L'astuce est de remplacer les returns par des throws
        // comme ci-dessous
        throw 1;
    }
    catch(...)
    {
        // A chacun de voir s'il a des trucs intelligents a faire ici
    }
    // Point de passage obligatoire pour liberer les ressources
    // Qu'on est leve une exception ou pas, ce code sera execute
    // C'est le seul endroit ou on s'en souci : pas de duplication
    // de code pour liberer les ressources (meme pas un appel de fonction
    // de liberation)
    for (int idx=0; idx<_nb_max_in_out; ++idx)
    {
        delete[] p_in2[idx];
        delete[] p_out2[idx];
    }
    delete[] p_in2;
    delete[] p_out2;
    delete[] sizein2;
    delete[] sizeout2;
}
 
void foo5(const char * file_name)
{
    TRACE("");
    std::stringstream string;
    string << "ls -l /proc/" << getpid() << "/fd";
    {
        FILE* file = fopen(file_name, "r");
        system(string.str().c_str());
        if (file != NULL)
        {
            boost::shared_ptr<FILE> file_shared_ptr(file, fclose);
        }
    }
    system(string.str().c_str());
}
 
int main(int argc, char ** argv)
{
    TRACE("");
 
    foo();
    foo2();
    foo3<classe2,int>();
    foo4<classe2,int>();
    foo5("essai.cc");
 
    return(0);
}
int main(int, char**) essai.cc 272  
void foo() essai.cc 108 classe1 c1; 
classe1::classe1() essai.cc 29  
void foo() essai.cc 111 classe1 c2(c1); 
classe1::classe1(const classe1&) essai.cc 37  
classe1& classe1::operator=(const classe1&) essai.cc 49  
classe1& classe1::operator=(const classe1&) essai.cc 52  
void foo() essai.cc 114 c2 = c1; 
classe1& classe1::operator=(const classe1&) essai.cc 49  
classe1& classe1::operator=(const classe1&) essai.cc 52  
void foo() essai.cc 117 classe1 c3 = c1; 
classe1::classe1(const classe1&) essai.cc 37  
classe1& classe1::operator=(const classe1&) essai.cc 49  
classe1& classe1::operator=(const classe1&) essai.cc 52  
void foo() essai.cc 120 c1 = c1; 
classe1& classe1::operator=(const classe1&) essai.cc 49  
void foo() essai.cc 123 classe2 c4; 
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
void foo() essai.cc 126 classe2 c5(c4); 
classe1::classe1() essai.cc 29  
classe2::classe2(const classe2&) essai.cc 87  
classe2& classe2::operator=(const classe2&) essai.cc 98  
classe1& classe1::operator=(const classe1&) essai.cc 49  
classe1& classe1::operator=(const classe1&) essai.cc 52  
void foo() essai.cc 129 c5 = c4; 
classe2& classe2::operator=(const classe2&) essai.cc 98  
classe1& classe1::operator=(const classe1&) essai.cc 49  
classe1& classe1::operator=(const classe1&) essai.cc 52  
void foo() essai.cc 132 classe2 c6 = c4; 
classe1::classe1() essai.cc 29  
classe2::classe2(const classe2&) essai.cc 87  
classe2& classe2::operator=(const classe2&) essai.cc 98  
classe1& classe1::operator=(const classe1&) essai.cc 49  
classe1& classe1::operator=(const classe1&) essai.cc 52  
void foo() essai.cc 135 c4 = c4; 
classe2& classe2::operator=(const classe2&) essai.cc 98  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe1::~classe1() essai.cc 43  
virtual classe1::~classe1() essai.cc 43  
virtual classe1::~classe1() essai.cc 43  
void foo2() essai.cc 148 0 
void foo2() essai.cc 148 1 
void foo2() essai.cc 148 2 
void foo2() essai.cc 148 3 
void foo2() essai.cc 148 4 
void foo2() essai.cc 148 5 
void foo2() essai.cc 148 6 
void foo2() essai.cc 148 7 
void foo2() essai.cc 148 8 
void foo2() essai.cc 148 9 
void foo2() essai.cc 153 10 
void foo2() essai.cc 153 10 
void foo2() essai.cc 153 10 
void foo2() essai.cc 153 10 
void foo2() essai.cc 153 10 
void foo2() essai.cc 153 10 
void foo2() essai.cc 153 10 
void foo2() essai.cc 153 10 
void foo2() essai.cc 153 10 
void foo2() essai.cc 153 10 
void foo2() essai.cc 158 9 
void foo2() essai.cc 158 9 
void foo2() essai.cc 158 9 
void foo2() essai.cc 158 9 
void foo2() essai.cc 158 9 
void foo2() essai.cc 158 9 
void foo2() essai.cc 158 9 
void foo2() essai.cc 158 9 
void foo2() essai.cc 158 9 
void foo2() essai.cc 158 10 
void foo3() [with T1 = classe2, T2 = int] essai.cc 165  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
void foo4() [with T1 = classe2, T2 = int] essai.cc 208  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
classe1::classe1() essai.cc 29  
classe2::classe2() essai.cc 82  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
virtual classe2::~classe2() essai.cc 93  
virtual classe1::~classe1() essai.cc 43  
void foo5(const char*) essai.cc 256  
total 0
lrwx------ 1 arpalhands arpalhands 64 nov  3 12:38 0 -> /dev/pts/4
lrwx------ 1 arpalhands arpalhands 64 nov  3 12:38 1 -> /dev/pts/4
lrwx------ 1 arpalhands arpalhands 64 nov  3 12:38 2 -> /dev/pts/4
lr-x------ 1 arpalhands arpalhands 64 nov  3 12:38 3 -> /home/arpalhands/essai.cc
total 0
lrwx------ 1 arpalhands arpalhands 64 nov  3 12:38 0 -> /dev/pts/4
lrwx------ 1 arpalhands arpalhands 64 nov  3 12:38 1 -> /dev/pts/4
lrwx------ 1 arpalhands arpalhands 64 nov  3 12:38 2 -> /dev/pts/4
boost.txt · Last modified: 2022/04/16 12:22 (external edit)
 
Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki