C++のメモリの扱い

C言語はメモリ確保関数だったが、C++は命令で確保する

### メモリ確保/解放命令
– new
メモリを確保する命令
確保できない場合はstd::bad_allocを投げる
std::nothrowを指定すると、例外ではなくnullptrを返す

– delete
newで確保した領域を解放する命令

– delete[]
newで確保した領域を解放する命令

# include <memory>

int main() {
    // 通常の確保
    char* p = new char[100];

    char* p2 = nullptr;
    try {
        p2 = new char[100];
    } catch (const std::bad_alloc& e) {

    }

    char* p3 = new(std::nothrow) char[100];
    if (p3 == nullptr) {
    }

    // 指定した領域からメモリを確保する
    char buf[100];
    char* p4 = new (buf) char[100];

    int* n = new int;
    int* n2 = new int();

    int* n3 = new int(10);

    delete n3;
    delete n2;
    delete n;

    delete[] p3;
    delete[] p2;
    delete[] p;

}
#include <iostream>

int main() {
    
    int* p = new int;
    *p = 77;
    std::cout << *p << std::endl;

    delete p;
}

### 配列の確保

#include <iostream>

int main() {
    
    int* arr = new int[5];
    
    for (int i = 0; i < 5; ++i)
        arr[i] = i * 10;

    for (int i = 0; i < 5; ++i)
        std::cout << arr[i] << " ";

    delete[] arr;
    return 0;
}

$ ./test
0 10 20 30 40

### スマートポインタ

#include <iostream>
#include <memory>

class Sample {
public:
    void greet() {
        std::cout << "Hello from Sample!\n";
    }
};

int main() {
    
    std::unique_ptr<Sample> ptr = std::make_unique<Sample>();
    ptr->greet();

    return 0;
}