メモリを動的に確保する

  new と delete



メモリを動的に確保する最も簡単な方法です (C++ の組み込み演算子)

一般的な C プログラムでは、関数 malloc と free を使ってヒープにメモリを割り当て、解放し、Windows API を使用する場合は GlobalAlloc と GlobalFree を使用します

※ 但し、Microsoft では以下のように記述されています

グローバル関数は他のメモリ管理関数より低速で、提供する機能も多くありません。
そのため、新しいアプリケーションは「heap functions」(ヒープ関数)を使うべきです。
しかし、DDE 関数とクリップボード関数では、依然としてグローバル関数が使われています

気にせず GlobalAlloc を使用して、スキルが上がってから HeapAlloc に挑戦しましょう

Windows API の文字列を取得する関数で、バッファの大きさが不足している場合に戻り値として必要なサイズが戻される場合があります。そのような場合は最初から不足するサイズを指定して必要なサイズを求め、その領域を割り付けてから使用します

1) GetWindowsDirectory
2) GetSystemDirectory
3) GetCurrentDirectory

  
#include "stdafx.h"
#include <malloc.h>
#include <windows.h>

int main(int argc, char* argv[])
{
	char *szBuffer;

	{
		// *****************************************
		//  C++ の new と delete
		// *****************************************
		UINT uBufferSize;

		uBufferSize = GetWindowsDirectory( NULL, 0 );

		szBuffer = new char[uBufferSize+10];  // 確保

		GetWindowsDirectory( szBuffer, uBufferSize );
		printf( "%s\n", szBuffer );

		delete [] szBuffer;  // 解放
	}

	{
		// *****************************************
		//  ランタイムライブラリ
		// *****************************************
		UINT uBufferSize;

		uBufferSize = GetSystemDirectory( NULL, 0 );

		szBuffer = (char *)malloc( (size_t)(uBufferSize+10) );  // 確保

		GetSystemDirectory( szBuffer, uBufferSize );
		printf( "%s\n", szBuffer );

		free( (void *)szBuffer );  // 解放
	}

	{
		// *****************************************
		//  Win32 API
		// *****************************************
		DWORD nBufferSize;

		nBufferSize = GetCurrentDirectory( 0, NULL );

		szBuffer = (char *)GlobalAlloc(GMEM_FIXED, nBufferSize+10);  // 確保

		GetCurrentDirectory( nBufferSize, szBuffer );
		printf( "%s\n", szBuffer );

		GlobalFree( (HGLOBAL)szBuffer );  // 解放
	}

	return 0;
}
  

メモリは必要な大きさより大きめに取得しましょう










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ