4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

mallocでメモリを確保して操作する様子を、ヒープを直に見ることで、観察する(Visual Studio 2017を使って)

Last updated at Posted at 2019-01-01

プログラミングがよくわからん。今まで付け焼き刃でやってきたけど、もう限界。よし、基礎から勉強しよう。しかし元旦にやることじゃないよなー、ってもう2日か。しかし、思い立ったが吉日なのである!

目的

メモリ(仮想かもしれません)への書き込みをじかに見ることで、結局コードを実行するということは「メモリ(プログラム領域を含む)とCPUとのやりとり」なんだな、と1階層下の事象に落とし込む。

概要

mallocしたときのポインタの値を見て、Visual StudioのDebugメニューのMemory windowを表示して、その値をアドレスバーに入れると、直にそのメモリ位置のダンプが見えます。その状態でポインタを使うコードをステップ実行して、様子を見ます。

準備

ビルドおよび C++ コンソール アプリ プロジェクトの実行 | Microsoft Docs

書かれているとおりにすればできます。

方法

コーディングの準備をする

Start Page - Microsoft Visual Studio 2019-01-02 03.57.04.png

新規プロジェクトを作成します。

New Project 2019-01-02 03.59.36.png

コンソールアプリを選びます。

コーディングする

プログラムの概要
  • コンソール上で文字列を入力すると、入力した文字列が出力されます
  • 内部では、あらかじめmallocでヒープに100バイトの領域を確保し、入力された文字列をそこへ入れ、出力し、最後に解放します。
ソースコード
#include "pch.h"
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <malloc.h>  // _msize()を使うのに必要

int main()
{
	char *str;

	/* 文字列のためのメモリを確保 */
	str = (char *)malloc(100);
	if (str == NULL) {
		printf("メモリが確保できません\n");
		exit(1);
	}

	/* 文字列を入力 */
	std::cin.getline(str, _msize(str));
	//std::cin.getline(str, sizeof(str));
	// こっちだと3文字しか表示されません
	// ポインタのサイズ(この場合は4バイト=32ビット、つまり32ビット環境)
	// を返してしまっているからです
	// (最後の1バイトは終端文字に使われている)

	/* 文字列の表示 */
	puts(str);

	/* メモリの解放 */
	free(str);

	return 0;
}

なぜsizeof()では駄目なのか?は以下のページでわかりやすく説明されています。

せりか式 - C 言語チュートリアル - sizeof演算子

malloc_usable_size()が使えない理由はこちらです。

[故]ぶろぐ: mallocで確保したサイズを後から取得する。

プログラムを実行する

ConsoleApplication2 - Microsoft Visual Studio 2019-01-02 04.07.16.png

ブレークポイントを置いて、ローカルでバッグ実行します。

2019年1月2日.PNG

ステップ実行する前に、メモリウィンドウを開きます。

ステップ実行します。

ConsoleApplication2 (Debugging) - Microsoft Visual Studio 2019-01-02 04.14.15.png

mallocでヒープメモリに確保された領域の先頭のアドレスが出てきました。そこを見てみましょう

ConsoleApplication2 (Debugging) - Microsoft Visual Studio 2019-01-02 04.16.51.png

左上にアドレスを入力すると、ちょうど100バイト、メモリが確保されています。

C__Users_uedat_source_repos_ConsoleApplication2_Debug_ConsoleApplication2.exe 2019-01-02 04.19.24.png

コンソールが起ち上がるので、好きな文字列を入れてEnterしましょう。

ConsoleApplication2 (Debugging) - Microsoft Visual Studio 2019-01-02 04.21.02.png

おお、入っています。

C__Users_uedat_source_repos_ConsoleApplication2_Debug_ConsoleApplication2.exe 2019-01-02 04.22.10.png

コンソールにも出力されました。

ConsoleApplication2 (Debugging) - Microsoft Visual Studio 2019-01-02 04.23.07.png

メモリが解放されました。

考察

Visual Studioってすごいんですね(疲れている)。

おまけ

The Weight of the World - YouTube

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?