#include #include #include #include #include #include #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 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 p_in22(p_in2); boost::scoped_array p_out22(p_out2); boost::scoped_array sizein22(sizein2); boost::scoped_array sizeout22(sizeout2); std::vector > vv; boost::shared_array 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 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_shared_ptr(file, fclose); } } system(string.str().c_str()); } int main(int argc, char ** argv) { TRACE(""); foo(); foo2(); foo3(); foo4(); 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