C++のfree関数とは?動的メモリ解放の基本と使い方を解説
C/C++の標準ライブラリ関数である void free(void *ptr) は、malloc、calloc、realloc によって事前に確保された動的メモリを解放(デアロケート)するための関数です。動的に確保したメモリを使い終わった後に必ず呼び出すことで、メモリリークを防ぐことができます。
free()関数の宣言
void free(void *ptr)
この関数は引数としてポインタ ptr を受け取ります。これは、malloc、calloc、または realloc によって以前に確保されたメモリブロックへのポインタであり、指し示された領域が解放されます。
なお、引数に NULL ポインタを渡した場合には何も処理が行われず、エラーにもなりません。そのため、条件分岐なしでも安全に呼び出すことができるのが特徴です。
使用例
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int main () {
char *str;
/* 初期メモリ確保 */
str = (char *) malloc(15);
strcpy(str, "tutorialspoint");
cout << "String = "<< str <<", Address = "<< &str << endl;
/* メモリ再確保 */
str = (char *) realloc(str, 25);
strcat(str, ".com");
cout << "String = "<< str <<", Address = "<< &str << endl;
/* 確保したメモリを解放 */
free(str);
return(0);
}このサンプルでは、まず malloc で15バイトのメモリを確保して文字列を格納し、次に realloc で25バイトに拡張して文字列を連結しています。最後に free を呼び出して、確保していたメモリを解放しています。
実行結果
String = tutorialspoint, Address = 0x22fe38 String = tutorialspoint.com, Address = 0x22fe38
free関数を使用する際の注意点
- 二重解放に注意: 同じメモリブロックに対して free を複数回呼び出すと、未定義動作となりプログラムがクラッシュする可能性があります。
- ダングリングポインタ: 解放後のポインタを使ってメモリにアクセスすると未定義動作になります。free の直後にポインタへ NULL を代入しておくと安全です。
- スタック領域は解放不可: free で解放できるのは、malloc / calloc / realloc でヒープ上に確保されたメモリのみです。通常のローカル変数などを渡してはいけません。
C++では new / delete 演算子やスマートポインタ(std::unique_ptr など)を使うのが一般的ですが、C言語由来のコードやレガシーコードを扱う際には、free 関数の正しい使い方を理解しておくことが重要です。
-
C++の引数依存の名前探索(ADL/Koenigルックアップ)とは?仕組みと具体例を解説
引数依存の名前探索(Argument-Dependent Lookup:ADL)は、関数呼び出し式において修飾されていない(名前空間を付けない)関数名を探索するためのC++の規則です。「Koenigルックアップ」という名前でも知られています。この規則は、オーバーロードされた演算子の暗黙的な関数呼び出しにも適用されます。つまり、+ や << などの演算子を使う際にも、ADLが裏側で働いているのです。通常の修飾なし名前探索では、呼び出し元のスコープや名前空間が対象となりますが、ADLではさらに引数の型が属する名前空間も探索対象に追加します。この仕組みのおかげで、別の名前空間で定義された
-
Linux向けC++開発に最適なIDEのおすすめ6選
大規模なプロジェクトをテキストエディタだけで管理するのは容易ではありません。そうしたケースではIDE(統合開発環境)を活用することで、生産性が向上し、フラストレーションも大幅に軽減されるでしょう。IDEにはさまざまな種類があり、自分のニーズに合ったものを選ぶことが重要です。「Linux上のC++開発において唯一のベスト」と呼べるIDEは存在せず、賢くツールを見極める必要があります。ここでは、人気が高く、編集部のおすすめでもあるLinux向けIDEを紹介します。Linuxで使えるC++向けIDE おすすめ6選1. NetBeansNetBeansは、C/C++をはじめ多くのプログラミング言語に対