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