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; }