Files
gpd-324/CPlusPlus/Pointer/main.cpp
T

123 lines
2.5 KiB
C++

#include <iostream>
#include <memory> // 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<int> number = make_unique<int>(10);
*number = 100;
//unique_ptr<int> number2 = number; // compiler error - you can create a copy of an unique pointer
unique_ptr<int> number2 = make_unique<int>(*number);
shared_ptr<int> number3 = make_shared<int>(20);
shared_ptr<int> number4 = number3;
*number3 = 200;
*number4 = 2000;
number3.reset();
weak_ptr<int> 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<int> tmpSharedNumber = weakNumber.lock();
*tmpSharedNumber = 20000;
}
number4.reset();
shared_ptr<int> 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;
}