C++ 基礎
首都大学東京 田川研究室
戻る

困ったときのQ&A

困ったとき、見ると助かるかも知れません。研究室の方々、遭遇、解決したら加筆願います。
行番号を表示させたい! Visual Studio 2013のテキストエディターがうざい! ハンドルされていない例外0xC0000005: 場所0sd0f0s LINK 外部参照~が未解決です スタックが壊れています Heap crupped stack over flow fopenがコンパイルできない。


行番号を表示させたい!

ツール->オプション->テキストエディター->すべての言語 の設定の行番号にチェック

Visual Studio 2013のテキストエディターがうざい!

ツール->オプション->テキストエディター->C/C++ の設定をお好きに変えてください。
タブを空白で埋めるにチェックを入れることを推奨します。

ハンドルされていない例外0xC0000005: 場所0sd0f0s

許可されていないメモリ領域へアクセスした場合に発生します。配列の領域外へアクセスした場合、メモリが確保されていないポインタで添え字演算[]を実行した場合、読み込みオンリーなメモリ領域に書き込もうとした場合など。

LINK 外部参照~が未解決です

これはそんなにあわてる必要は無いです。ライブラリの設定、ライブラリがあるフォルダの設定を落ち着いて行います。
Visual Studioの場合、
プロジェクト->プロパティ->構成プロパティ->VC++ディレクトリ にライブラリの場所を指定。
プロジェクト->プロパティ->構成プロパティ->VC++ディレクトリ にライブラリ、ヘッダの場所を指定します。

すでに入っている文字列選択し、右横に出てくる矢印を押します。編集というメニューが出てくると思うのでクリックします。


右上のフォルダーマークをクリックするとライブラリフォルダのパスおよび、ヘッダファイルフォルダのパスを追加できます。

$(SolutionDir)folder

のように記述でき、これでプロジェクトのトップディレクトリ->folder
という意味になります。このように指定していきます。

C:\Program files\---\ss...

のようにすれば完全なパスを指定することもできます。ライブラリはヘッダだけをインクルードしたのでは使えません。標準ライブラリは規定で設定してあるので追加設定なしで使用できるのです。
なおこの作業はWindowsだけのものではなく、他のどの環境であっても必要となります。これにより柔軟なプログラムが記述できます。
その他、ヘッダに定義してある関数を、処理内容を記述せずに呼び出そうとした場合などにも発生します。Cppファイルの方に関数の処理内容を記述しましょう。

スタックが壊れています

ローカル変数を delete 演算子で削除しようとした場合などに発生した経験が。ローカル変数の配列オーバーでも発生するかも。

Heap crupped

ヒープの破壊。物理的に壊れているわけではありません。メモリ管理データが壊れていてOSでメモリを管理できなくなる状態です。プログラムは強制終了されます。delete 演算子で無効なメモリをさしているポインタを解放しようとしたり、厄介なのが添え字演算子でオーバーアクセスした経歴のあるメモリ領域(配列)をdelete 演算子で解放したときにも発生します。

stack over flow

スタックの領域外へローカル変数などがアクセスした場合です。関数内のローカル変数を確保しすぎだとか、ローカル変数の配列のアクセスミスだとか。(特に-1で添え字演算[-1]を実行したとき)

fopenがコンパイルできない。

windows8からセキュリティーが厳しくなりました。VS2013も同様で、fopen等脆弱性のもととなる関数は標準で使用できなくなっています。fopen_sを使うか、

プロジェクト->プロパティ->構成プロパティ->C/C++->全般->SDLチェック を無効にします。