new creates an object dynamically, and delete releases it.

delete Every object created with `new` should be released with `delete` when it is no longer needed.

Dynamic Allocation

example
dynamic_allocation.cpp
Replay: real traced execution (multi-file project)
#include <iostream>

int main() {
    int start = 6;
    int step = 2;
    int* number = new int(start);

    *number += step;

    std::cout << "value=" << *number << std::endl;

    delete number;
    number = nullptr;

    std::cout << "released=" << (number == nullptr) << std::endl;
    return 0;
}
#include <iostream>

int main() {
    int start = 3;
    int step = 2;
    int* number = new int(start);

    *number += step;

    std::cout << "value=" << *number << std::endl;

    delete number;
    number = nullptr;

    std::cout << "released=" << (number == nullptr) << std::endl;
    return 0;
}
#include <iostream>

int main() {
    int start = 10;
    int step = 2;
    int* number = new int(start);

    *number += step;

    std::cout << "value=" << *number << std::endl;

    delete number;
    number = nullptr;

    std::cout << "released=" << (number == nullptr) << std::endl;
    return 0;
}
#include <iostream>

int main() {
    int start = 6;
    int step = 1;
    int* number = new int(start);

    *number += step;

    std::cout << "value=" << *number << std::endl;

    delete number;
    number = nullptr;

    std::cout << "released=" << (number == nullptr) << std::endl;
    return 0;
}
#include <iostream>

int main() {
    int start = 6;
    int step = 4;
    int* number = new int(start);

    *number += step;

    std::cout << "value=" << *number << std::endl;

    delete number;
    number = nullptr;

    std::cout << "released=" << (number == nullptr) << std::endl;
    return 0;
}
  1. start ← 6, step ← 2, number ← ⟨addr A⟩

    3int main() {4    int start→ 6 = 6; //@start=3, 105    int step→ 2 = 2; //@step=1, 46    int* number→ ⟨addr A⟩ = new int(start);78    *number⟨addr A⟩ += step2;910    std::cout << "value=" << *number⟨addr A⟩ << std::endl;1112    delete number;13    number→ 0 = nullptr;1415    std::cout << "released=" << (number0 == nullptr) << std::endl;16    return 0;17}
    outputvalue=8
    released=1
  1. start ← 3, step ← 2, number ← ⟨addr A⟩

    3int main() {4    int start→ 3 = 3;5    int step→ 2 = 2;6    int* number→ ⟨addr A⟩ = new int(start);78    *number⟨addr A⟩ += step2;910    std::cout << "value=" << *number⟨addr A⟩ << std::endl;1112    delete number;13    number→ 0 = nullptr;1415    std::cout << "released=" << (number0 == nullptr) << std::endl;16    return 0;17}
    outputvalue=5
    released=1
  1. start ← 10, step ← 2, number ← ⟨addr A⟩

    3int main() {4    int start→ 10 = 10;5    int step→ 2 = 2;6    int* number→ ⟨addr A⟩ = new int(start);78    *number⟨addr A⟩ += step2;910    std::cout << "value=" << *number⟨addr A⟩ << std::endl;1112    delete number;13    number→ 0 = nullptr;1415    std::cout << "released=" << (number0 == nullptr) << std::endl;16    return 0;17}
    outputvalue=12
    released=1
  1. start ← 6, step ← 1, number ← ⟨addr A⟩

    3int main() {4    int start→ 6 = 6;5    int step→ 1 = 1;6    int* number→ ⟨addr A⟩ = new int(start);78    *number⟨addr A⟩ += step1;910    std::cout << "value=" << *number⟨addr A⟩ << std::endl;1112    delete number;13    number→ 0 = nullptr;1415    std::cout << "released=" << (number0 == nullptr) << std::endl;16    return 0;17}
    outputvalue=7
    released=1
  1. start ← 6, step ← 4, number ← ⟨addr A⟩

    3int main() {4    int start→ 6 = 6;5    int step→ 4 = 4;6    int* number→ ⟨addr A⟩ = new int(start);78    *number⟨addr A⟩ += step4;910    std::cout << "value=" << *number⟨addr A⟩ << std::endl;1112    delete number;13    number→ 0 = nullptr;1415    std::cout << "released=" << (number0 == nullptr) << std::endl;16    return 0;17}
    outputvalue=10
    released=1