Files
gpd-924-en/CPlusPlus/Pointers/main.cpp
T
david 3b35b973c9 add smart pointers
add polymorphism
add destructor & copy constructor
add pointer-pointer
2025-09-22 18:22:03 +02:00

78 lines
2.0 KiB
C++

#include <iostream>
#include <memory>
#include "functions.h"
using namespace std;
int main()
{
// general
int* pNumber = nullptr; // pointer definition, always initialize a pointer (at least with nullptr)
pNumber = new int(0); // creates a new integer value on the heap
cout << "size of pointer: " << sizeof(pNumber) << endl;
cout << "size of pointer data: " << sizeof(*pNumber) << endl;
*pNumber = 789;
//pNumber = new int(0); // BAD BAD - memory leak, because we override an existin g pointer address with a new one without saving or deleting the old one
// here are 100s lines of code
if (pNumber != nullptr)
{
delete pNumber;
pNumber = nullptr;
}
// pointer as references outside local scope
int number = 10;
changeInteger(number);
number = changeIntegerPerReturn(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 a loose connection to a shared pointer
unique_ptr<int> pNumber2 = make_unique<int>(10);
*pNumber2 = 100;
//unique_ptr<int> pNumber3 = pNumber2; // compiler error- you can't create a copy of an unique pointer
unique_ptr<int> pNumber4 = make_unique<int>(*pNumber2);
shared_ptr<int> pNumber5 = make_shared<int>(10);
shared_ptr<int> pNumber6 = pNumber5;
*pNumber6 = 100;
pNumber5.reset();
weak_ptr<int> pNumber7 = pNumber6;
//*pNumber7 = 1000; // compiler error, weak pointer has no direct access to a shared pointer, you have to create a new shared pointer
if (!pNumber7.expired())
{
shared_ptr<int> tmpSharedNumber = pNumber7.lock();
*tmpSharedNumber = 10000;
}
pNumber6.reset();
shared_ptr<int> tmpSharedNumber2 = pNumber7.lock();
if (tmpSharedNumber2 != nullptr) *tmpSharedNumber2 = 100000;
// pointer-pointer
createInteger(pNumber);
createIntegerWithPointerPointer(&pNumber);
if (pNumber != nullptr)
{
delete pNumber;
pNumber = nullptr;
}
return 0;
}