C/C++でローカル変数のメモリにスコープ外からアクセスできるのか?
C/C++では、ローカル変数のメモリにスコープ外からアクセスできてしまう可能性があります。まずは具体的なコード例を見てみましょう。
コード例
#include<iostream>
int* foo() {
int x = 3;
return &x;
}
int main() {
int* address = foo();
cout << *address;
*address = 12;
cout << *address;
}出力結果
このプログラムは、次のような出力を返す場合があります。
3 12
なぜ動いて見えるのか
先述のとおり、このコードは「たまたま動作するかもしれない」だけです。ここでは、かつて x のアドレスだったメモリ領域に対して、単に読み書きを行っているにすぎません。main 関数内ではすでに foo のスコープ外にいるため、address は実質的に「どこかのランダムなメモリ領域」を指すポインタです。
上記の例では運よく、そのメモリ領域がまだ存在しており、ほかの処理には使われていませんでした。そのため、使い続けても何も壊れず(別プロセスのメモリや不正なメモリ領域を操作することはない)、まだ誰にも上書きされていないため、値の 3 がそのまま残っていたというわけです。
実際のプログラムでは危険
しかし現実のプログラムでは、そのメモリはほぼ即座に再利用される可能性があり、このようなアクセスによってプログラムを破壊してしまう恐れがあります。こうしたメモリアクセスに関するバグは、原因の特定と修正が極めて困難なことで知られています。
foo 関数から制御が戻るとき、プログラムは OS に対して「x のメモリはもう使用されていないため、他の用途に割り当てて構わない」と伝えます。運良くそのメモリが再割り当てされず、OS も不正アクセスとして検知しなければ、見かけ上は問題なく動いてしまうかもしれません。
まとめ:未定義動作に頼らないこと
このようなコードは言語仕様上未定義動作(undefined behavior)に該当します。コンパイラや環境が変われば挙動は保証されず、一見正しく動いたとしてもそれは偶然にすぎません。スコープ外のローカル変数へは決してアクセスせず、必要に応じて動的メモリ確保やスマートポインタなど、安全な手段を利用しましょう。
-
Windowsで使えるC++開発向けおすすめIDE 7選
```html 大規模なプロジェクトをプレーンなテキストエディターだけで管理するのは困難です。こうしたケースではIDE(統合開発環境)を使った方が、生産性が向上しストレスも大幅に軽減されます。IDEにはさまざまな種類があり、自分のニーズに合ったものを選ぶことが重要です。ここでは、Windowsで利用できる優れたC/C++向けIDEをご紹介します。 1. Visual Studio Microsoftが開発した定番IDEです。Windows上でのC++プログラムの構築・開発・プロファイリングにおいて、最高クラスのツール群を備えています。豊富なプラグインストアも魅力で、Azure、PowerShe
-
C++の変数にconstとvolatileを同時に指定できる?
C++の変数にconstとvolatileを同時に指定できる?結論から言うと、はい、C++の変数にはconstとvolatileを同時に宣言することが可能です。一見矛盾しているように見えるこの2つの修飾子ですが、実際にはそれぞれ異なる役割を持っているため、併用しても問題ありません。主な使用場面「const volatile」の組み合わせは、次のような状況でよく利用されます。読み取り専用のハードウェアレジスタ別スレッドの出力結果を受け取る変数それぞれのキーワードの意味volatile: 変数の値が、現在実行中のスレッドの外部(ハードウェアや別スレッドなど)によって変更される可能性があることをコン