From 5ee42020200ae6eea52e60fbf38e8da1ed7deec9 Mon Sep 17 00:00:00 2001 From: hugogogo Date: Thu, 16 Jun 2022 18:05:28 +0200 Subject: [PATCH] implemented delete correction for leaks --- Makefile | 2 +- headers/A_test.hpp | 1 + headers/tests_utils.hpp | 50 +++-- headers/vector.hpp | 1 + templates/vector.tpp | 10 +- tests/main.cpp | 7 +- tests/tests_vectors.cpp | 403 ++++++++++++++++++---------------------- 7 files changed, 229 insertions(+), 245 deletions(-) diff --git a/Makefile b/Makefile index c1ae16b..c735690 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ RESET = "\e[0m" NAME = containers -CC = g++ +CC = clang++ EXT = cpp CFLAGS = -Wall -Wextra -Werror $(INCLUDES) diff --git a/headers/A_test.hpp b/headers/A_test.hpp index 1f4c86b..f7e774f 100644 --- a/headers/A_test.hpp +++ b/headers/A_test.hpp @@ -5,6 +5,7 @@ struct A_test { + virtual ~A_test(){}; std::string title; std::string type; virtual void func() = 0; diff --git a/headers/tests_utils.hpp b/headers/tests_utils.hpp index 6c59cad..92eb10f 100644 --- a/headers/tests_utils.hpp +++ b/headers/tests_utils.hpp @@ -23,17 +23,11 @@ #endif -// global declarations -// ************************************ -extern std::vector test_list; -extern void add_to_list(std::string s, A_test* s1, A_test* s2, A_test* s3, A_test* s4); - - // struct for tests // *************************************** struct mystruct { public: - mystruct(int data = 0) {_val = new int[5]; _val[0] = data;} + mystruct(int data = 0) {_val = new int[2]; _val[0] = data; _val[1] = data;} ~mystruct() {delete[] _val;} int * get_data() const {return _val;} private: @@ -41,11 +35,21 @@ private: }; //extern std::ostream & operator<<(std::ostream & o, mystruct const & rhs); std::ostream & operator<<(std::ostream & o, mystruct const * rhs) { - o << (*rhs).get_data()[0]; + if (rhs != NULL) + o << (*rhs).get_data()[0] << "," << (*rhs).get_data()[1]; + else + o << "NULL"; return (o); } +// global declarations +// ************************************ +extern std::vector test_list; +extern void add_to_list(std::string s, A_test* s1, A_test* s2, A_test* s3, A_test* s4); +std::vector mem_list_struct; + + // adding each test to the list // *************************** #define TEST(f_name) \ @@ -67,7 +71,8 @@ std::ostream & operator<<(std::ostream & o, mystruct const * rhs) { // **************************************** # define TITLE(s) std::cout << "\n" B_PURPLE #s RESET "\n\n"; # define VAL(n) val(n) -# define PRINT(n) print_vector(n) +# define PRINT(n) print_vector(n); +# define DELETE delete_structs(); // get a value @@ -94,22 +99,39 @@ template <> } template <> mystruct* val(int n) { - - return ( new mystruct(n) ); + + mystruct *s = new mystruct(n); + mem_list_struct.push_back(s); + return ( s ); } // get a value // ********************************************* template -void print_vector(ft::vector vec) -{ + void print_vector(ft::vector vec) { + int i = 0; - for (typename ft::vector::iterator it = vec.begin(); it != vec.end(); ++it, i++) + typename ft::vector::iterator it; + typename ft::vector::iterator it_end = vec.end(); + + for (it = vec.begin(); it != it_end; ++it, i++) std::cout << "[" << i << "]" << *it << " "; std::cout << "\nsize:" << vec.size() << " capacty:" << vec.capacity() << "\n"; } +// delete vector elements +// ********************************** +void delete_structs() { + + std::vector::iterator it; + std::vector::iterator it_end = mem_list_struct.end(); + + for (it = mem_list_struct.begin(); it != it_end; ++it) + delete *it; +} + + #endif diff --git a/headers/vector.hpp b/headers/vector.hpp index 78bb779..e360b5f 100644 --- a/headers/vector.hpp +++ b/headers/vector.hpp @@ -1,3 +1,4 @@ + #ifndef VECTOR_HPP # define VECTOR_HPP diff --git a/templates/vector.tpp b/templates/vector.tpp index 8f44e93..e347503 100644 --- a/templates/vector.tpp +++ b/templates/vector.tpp @@ -138,6 +138,9 @@ VT_TPL void VT:: reserve( size_type new_cap ) { value_type * tmp_ptr; + value_type * old_ptr = _mem_ptr; + iterator first = begin(); + iterator last = end(); if (new_cap > _allocator.max_size()) throw std::length_error("reserve: new_cap > max_size"); @@ -151,10 +154,11 @@ VT_TPL void VT:: if (_mem_ptr) { - for (size_type i = 0; i < _size; i++) - tmp_ptr[i] = _mem_ptr[i]; + _mem_ptr = tmp_ptr; + _size = 0; + assign(first, last); _destroy(begin(), end()); - _allocator.deallocate(_mem_ptr, _capacity); + _allocator.deallocate(old_ptr, _capacity); } _mem_ptr = tmp_ptr; } diff --git a/tests/main.cpp b/tests/main.cpp index 6426b6d..9d93052 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -8,15 +8,15 @@ int main() { // VECTOR - tests_vector_constructor(); - tests_vector_operator_assignation(); +// tests_vector_constructor(); +// tests_vector_operator_assignation(); // tests_vector_begin(); // tests_vector_end(); // tests_vector_rbegin(); // tests_vector_rend(); // tests_vector_size(); // tests_vector_max_size(); -// tests_vector_resize(); + tests_vector_resize(); // tests_vector_capacity(); // tests_vector_empty(); // tests_vector_reserve(); @@ -101,6 +101,7 @@ int main() { std::cout << "\n" << B_CYAN << "-- " << test_list[i][j]->type << " --" << RESET "\n"; test_list[i][j]->func(); + delete test_list[i][j]; } } std::cout << "\n"; diff --git a/tests/tests_vectors.cpp b/tests/tests_vectors.cpp index 32efaec..0dd832e 100644 --- a/tests/tests_vectors.cpp +++ b/tests/tests_vectors.cpp @@ -46,231 +46,186 @@ TEST(tests_vector_operator_assignation) PRINT(bar); } +TEST(tests_vector_begin) +{ + // title + TITLE(cplusplus.com reference :) + + ft::vector myvector; + for (int i=1; i<=5; i++) myvector.push_back(VAL(i)); + + std::cout << "myvector contains:\n"; + PRINT(myvector); +} + +TEST(tests_vector_end) +{ + // title + TITLE(cplusplus.com reference :) + + ft::vector myvector; + for (int i=1; i<=5; i++) myvector.push_back(VAL(i)); + + std::cout << "myvector contains:\n"; + PRINT(myvector); +} + +TEST(tests_vector_rbegin) +{ + // title + TITLE(cplusplus.com reference :) + + ft::vector myvector (5); + + int i=0; + + typename ft::vector::reverse_iterator rit = myvector.rbegin(); + for (; rit!= myvector.rend(); ++rit) + *rit = VAL(++i); + + std::cout << "myvector contains:"; + PRINT(myvector); +} + +TEST(tests_vector_rend) +{ + // title + TITLE(cplusplus.com reference :) + + ft::vector myvector (5); // 5 default-constructed Ts + + typename ft::vector::reverse_iterator rit = myvector.rbegin(); + + int i=0; + for (rit = myvector.rbegin(); rit!= myvector.rend(); ++rit) + *rit = VAL(++i); + + std::cout << "myvector contains:"; + PRINT(myvector); +} + +TEST(tests_vector_size) +{ + // title + TITLE(cplusplus.com reference :) + + ft::vector myarr; + std::cout << "0. size: " << myarr.size() << '\n'; + + for (int i=0; i<10; i++) myarr.push_back(VAL(i)); + std::cout << "1. size: " << myarr.size() << '\n'; + + myarr.insert (myarr.end(),10,VAL(100)); + std::cout << "2. size: " << myarr.size() << '\n'; + + myarr.pop_back(); + std::cout << "3. size: " << myarr.size() << '\n'; + + PRINT(myarr); +} + +TEST(tests_vector_max_size) +{ + // title + TITLE(cplusplus.com reference :) + + ft::vector myvector; + + // set some content in the vector: + for (int i=0; i<100; i++) myvector.push_back(VAL(i)); + + std::cout << "size: " << myvector.size() << "\n"; + std::cout << "capacity: " << myvector.capacity() << "\n"; + std::cout << "max_size: " << myvector.max_size() << "\n"; + + PRINT(myvector); +} + +TEST(tests_vector_resize) +{ + // title + TITLE(cplusplus.com reference :) + + ft::vector myvector; + + // set some initial content: + for (int i = 1; i < 10; i++) myvector.push_back(VAL(i)); + + myvector.resize(5); + myvector.resize(8,VAL(100)); + myvector.resize(12); + + std::cout << "myvector contains:"; + PRINT(myvector); + + + // title + TITLE(test size and capacity 1 :) + + ft::vector vector2; + + std::cout << "size: " << vector2.size() << " - capacity: " << vector2.capacity() << "\n\n"; + + std::cout << "assign(10, 1)\n"; + vector2.assign(10, VAL(1)); + PRINT(vector2); + + std::cout << "\n"; + + std::cout << "resize(15)\n"; + vector2.resize(15); + PRINT(vector2); + + std::cout << "\n"; + + std::cout << "resize(10)\n"; + vector2.resize(10); + PRINT(vector2); + + std::cout << "\n"; + + std::cout << "resize(19)\n"; + vector2.resize(19); + PRINT(vector2); + + std::cout << "\n"; + + std::cout << "resize(20)\n"; + vector2.resize(20); + PRINT(vector2); + + std::cout << "\n"; + + std::cout << "resize(21)\n"; + vector2.resize(21); + PRINT(vector2); + + std::cout << "\n"; + + + // title + TITLE(test size and capacity 2 :) + + ft::vector vector3; + + std::cout << "size: " << vector3.size() << " - capacity: " << vector3.capacity() << "\n\n"; + + std::cout << "assign(10, 1)\n"; + vector3.assign(10, VAL(1)); + PRINT(vector3); + + std::cout << "\n"; + + std::cout << "resize(21)\n"; + vector3.resize(21); + PRINT(vector3); + + std::cout << "\n"; + + DELETE +} + /* -void tests_vector_begin() { - TEST(vector::begin) - { - // title - TITLE(cplusplus.com reference :) - - ft::vector myvector; - for (int i=1; i<=5; i++) myvector.push_back(i); - - std::cout << "myvector contains:"; - for (ft::vector::iterator it = myvector.begin() ; it != myvector.end(); ++it) - std::cout << ' ' << *it; - std::cout << '\n'; - } - TESTEND -} - -void tests_vector_end() -{ - TEST(vector::end) - { - // title - TITLE(cplusplus.com reference :) - - ft::vector myvector; - for (int i=1; i<=5; i++) myvector.push_back(i); - - std::cout << "myvector contains:"; - for (ft::vector::iterator it = myvector.begin() ; it != myvector.end(); ++it) - std::cout << ' ' << *it; - std::cout << '\n'; - } - TESTEND -} - -void tests_vector_rbegin() -{ - TEST(vector::rbegin) - { - // title - TITLE(cplusplus.com reference :) - - ft::vector myvector (5); // 5 default-constructed ints - - int i=0; - - ft::vector::reverse_iterator rit = myvector.rbegin(); - for (; rit!= myvector.rend(); ++rit) - *rit = ++i; - - std::cout << "myvector contains:"; - for (ft::vector::iterator it = myvector.begin(); it != myvector.end(); ++it) - std::cout << ' ' << *it; - std::cout << '\n'; - } - TESTEND -} - -void tests_vector_rend() -{ - TEST(vector::rend) - { - // title - TITLE(cplusplus.com reference :) - - ft::vector myvector (5); // 5 default-constructed ints - - ft::vector::reverse_iterator rit = myvector.rbegin(); - - int i=0; - for (rit = myvector.rbegin(); rit!= myvector.rend(); ++rit) - *rit = ++i; - - std::cout << "myvector contains:"; - for (ft::vector::iterator it = myvector.begin(); it != myvector.end(); ++it) - std::cout << ' ' << *it; - std::cout << '\n'; - } - TESTEND -} - -void tests_vector_size() -{ - TEST(vector::size) - { - // title - TITLE(cplusplus.com reference :) - - ft::vector myints; - std::cout << "0. size: " << myints.size() << '\n'; - - for (int i=0; i<10; i++) myints.push_back(i); - std::cout << "1. size: " << myints.size() << '\n'; - - myints.insert (myints.end(),10,100); - std::cout << "2. size: " << myints.size() << '\n'; - - myints.pop_back(); - std::cout << "3. size: " << myints.size() << '\n'; - } - TESTEND -} - -void tests_vector_max_size() -{ - TEST(vector::max_size) - { - // title - TITLE(cplusplus.com reference :) - - ft::vector myvector; - - // set some content in the vector: - for (int i=0; i<100; i++) myvector.push_back(i); - - std::cout << "size: " << myvector.size() << "\n"; - std::cout << "capacity: " << myvector.capacity() << "\n"; - std::cout << "max_size: " << myvector.max_size() << "\n"; - } - TESTEND -} - -void tests_vector_resize() -{ - TEST(vector::resize) - { - // title - TITLE(cplusplus.com reference :) - - ft::vector myvector; - - // set some initial content: - for (int i = 1; i < 10; i++) myvector.push_back(i); - - myvector.resize(5); - myvector.resize(8,100); - myvector.resize(12); - - std::cout << "myvector contains:"; - for (unsigned int i = 0; i < myvector.size(); i++) - std::cout << ' ' << myvector[i]; - std::cout << '\n'; - - - // title - TITLE(test size and capacity 1 :) - - ft::vector vector2; - - std::cout << "size: " << vector2.size() << " - capacity: " << vector2.capacity() << "\n\n"; - - std::cout << "assign(10, 1)\n"; - vector2.assign(10, 1); - for (unsigned int i = 0; i < vector2.size(); i++) - std::cout << "[" << i << "]" << vector2[i] << " "; - std::cout << "\n"; - - std::cout << "\nsize: " << vector2.size() << " - capacity: " << vector2.capacity() << "\n\n"; - - std::cout << "resize(15)\n"; - vector2.resize(15); - for (unsigned int i = 0; i < vector2.size(); i++) - std::cout << "[" << i << "]" << vector2[i] << " "; - std::cout << "\n"; - - std::cout << "\nsize: " << vector2.size() << " - capacity: " << vector2.capacity() << "\n\n"; - - std::cout << "resize(10)\n"; - vector2.resize(10); - for (unsigned int i = 0; i < vector2.size(); i++) - std::cout << "[" << i << "]" << vector2[i] << " "; - std::cout << "\n"; - - std::cout << "\nsize: " << vector2.size() << " - capacity: " << vector2.capacity() << "\n\n"; - - std::cout << "resize(19)\n"; - vector2.resize(19); - for (unsigned int i = 0; i < vector2.size(); i++) - std::cout << "[" << i << "]" << vector2[i] << " "; - std::cout << "\n"; - - std::cout << "\nsize: " << vector2.size() << " - capacity: " << vector2.capacity() << "\n\n"; - - std::cout << "resize(20)\n"; - vector2.resize(20); - for (unsigned int i = 0; i < vector2.size(); i++) - std::cout << "[" << i << "]" << vector2[i] << " "; - std::cout << "\n"; - - std::cout << "\nsize: " << vector2.size() << " - capacity: " << vector2.capacity() << "\n\n"; - - std::cout << "resize(21)\n"; - vector2.resize(21); - for (unsigned int i = 0; i < vector2.size(); i++) - std::cout << "[" << i << "]" << vector2[i] << " "; - std::cout << "\n"; - - - // title - TITLE(test size and capacity 2 :) - - ft::vector vector3; - - std::cout << "size: " << vector3.size() << " - capacity: " << vector3.capacity() << "\n\n"; - - std::cout << "assign(10, 1)\n"; - vector3.assign(10, 1); - for (unsigned int i = 0; i < vector3.size(); i++) - std::cout << "[" << i << "]" << vector3[i] << " "; - std::cout << "\n"; - - std::cout << "\nsize: " << vector3.size() << " - capacity: " << vector3.capacity() << "\n\n"; - - std::cout << "resize(21)\n"; - vector3.resize(21); - for (unsigned int i = 0; i < vector3.size(); i++) - std::cout << "[" << i << "]" << vector3[i] << " "; - std::cout << "\n"; - - std::cout << "\nsize: " << vector3.size() << " - capacity: " << vector3.capacity() << "\n\n"; - } - TESTEND -} - void tests_vector_capacity() { TEST(vector::capacity)