This shows you the differences between two versions of the page.
— |
boost [2022/04/16 12:22] (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> | ||