投稿

5月, 2022の投稿を表示しています

C言語でRAII

前置き:RAII って?  C++ 言語には RAII; Resource Acquisition is Initialization という考え方があります。これはどういうことでしょうか。 #define ARRY_SZ (5) int32_t p_arry = (int32_t *)malloc(sizeof(int32_t) * ARRY_SZ); p_arry[0] = 1; p_arry[1] = 2; p_arry[2] = 3; p_arry[3] = 4; p_arry[4] = 5; for (size_t idx=0; idx<ARRY_SZ; ++idx) { printf("p_arry[%zu]=%" PRId32 "\n", idx, p_arry[idx]); } よくある、Cでヒープ確保するコードですが、このコード片は free(p_arry) を呼び出し忘れているため、もしかしたらメモリーがリークするかもしれません。また、for 文で値を表示する前に p_arry[n] = n+1; の形式で確保した領域を初期化していますが、ここで初期化を忘れていたらどうでしょう。未初期化の領域を読み出そうとするのは Undefined Behavior なので、鼻から悪魔が出るかもしれません。 #include <cstddef> #include <cstdint> #include <cstdio> #include <cinttypes> #include <new> #include <initializer_list> class HeapArray { private: std::int32_t *values = nullptr; std::size_t size = 0; public: HeapArray() = delete; HeapArray(std::initializer_list<std::int32_t> init) { this->values = new(std::nothrow) std::int32