1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // <memory> 11 12 // shared_ptr 13 14 // template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args); 15 16 #include <memory> 17 #include <new> 18 #include <cstdlib> 19 #include <cassert> 20 21 int new_count = 0; 22 operator new(std::size_t s)23void* operator new(std::size_t s) throw(std::bad_alloc) 24 { 25 ++new_count; 26 return std::malloc(s); 27 } 28 operator delete(void * p)29void operator delete(void* p) throw() 30 { 31 std::free(p); 32 } 33 34 struct A 35 { 36 static int count; 37 AA38 A(int i, char c) : int_(i), char_(c) {++count;} AA39 A(const A& a) 40 : int_(a.int_), char_(a.char_) 41 {++count;} ~AA42 ~A() {--count;} 43 get_intA44 int get_int() const {return int_;} get_charA45 char get_char() const {return char_;} 46 private: 47 int int_; 48 char char_; 49 }; 50 51 int A::count = 0; 52 main()53int main() 54 { 55 int nc = new_count; 56 { 57 int i = 67; 58 char c = 'e'; 59 std::shared_ptr<A> p = std::make_shared<A>(i, c); 60 assert(new_count == nc+1); 61 assert(A::count == 1); 62 assert(p->get_int() == 67); 63 assert(p->get_char() == 'e'); 64 } 65 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 66 nc = new_count; 67 { 68 char c = 'e'; 69 std::shared_ptr<A> p = std::make_shared<A>(67, c); 70 assert(new_count == nc+1); 71 assert(A::count == 1); 72 assert(p->get_int() == 67); 73 assert(p->get_char() == 'e'); 74 } 75 #endif 76 assert(A::count == 0); 77 } 78