#include #include // smart pointer header using namespace std; void changeInteger(int n); void changeIntegerPerPointer(int* pN); int changeIntegerPerReturn(int n); void changeIntegerPerReference(int& n); bool createInteger(int* pN); bool createIntegerWithPointerPointer(int** ppN); int main() { // general int* pNumber = nullptr; pNumber = new int(0); cout << "size of pNumber: " << sizeof(pNumber) << endl; cout << "size of pNumber data: " << sizeof(*pNumber) << endl; *pNumber = 567; // pNumber = new int(0); // BAD BAD - Memory Leak, because we override an existing pointer address with a new one without saving the old one // here are 100s of lines of code if (pNumber != nullptr) { delete pNumber; pNumber = nullptr; } // pointer as references //int number = 0; //changeInteger(number); //changeIntegerPerPointer(&number); //changeIntegerPerPointer(pNumber); //changeIntegerPerReference(number); // smart pointer // unique_ptr -> only one owner exist for the object // shared_ptr -> can have multiple owners // weak_ptr -> is loose connection to a shared_ptr unique_ptr number = make_unique(10); *number = 100; //unique_ptr number2 = number; // compiler error - you can create a copy of an unique pointer unique_ptr number2 = make_unique(*number); shared_ptr number3 = make_shared(20); shared_ptr number4 = number3; *number3 = 200; *number4 = 2000; number3.reset(); weak_ptr weakNumber = number4; //*weakNumber = 20000; // compiler error, weak pointer have no direct access to a shared pointer, you have to create one if (!weakNumber.expired()) { shared_ptr tmpSharedNumber = weakNumber.lock(); *tmpSharedNumber = 20000; } number4.reset(); shared_ptr tmpSharedNumber = weakNumber.lock(); // pointer-pointer if (createInteger(pNumber)) { cout << "Create integer was succesful" << endl; } if (createIntegerWithPointerPointer(&pNumber)) { cout << "Create integer was succesful" << endl; } if (pNumber != nullptr) { delete pNumber; pNumber = nullptr; } return 0; } void changeInteger(int n) { n = 100; } void changeIntegerPerPointer(int* pN) { cout << "address of pN: " << &pN << endl; if (pN == nullptr) return; // BE CAREFUL - if you don't what you get, do a test before *pN = 200; } void changeIntegerPerReference(int& n) { n = 300; } bool createInteger(int* pN) { pN = new int(0); // CAUTION - creates a MEMORY LEAK return false; } bool createIntegerWithPointerPointer(int** ppN) { *ppN = new int(0); return true; }