Differences

This shows you the differences between two versions of the page.

Link to this comparison view

boost [2012/11/04 20:59] (current)
Line 1: Line 1:
 +<code c++>
 +#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);
 +}
 +</code>
 +<file>
 +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
 +</file>
  
boost.txt ยท Last modified: 2012/11/04 20:59 (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