new/deleteカスタムメモリ管理の再ロード
5687 ワード
new/deleteはC++の事前定義されたオペレータです.New/delete動作:–new 1、十分なメモリ領域を取得(デフォルトはスタック領域)2、クラスのコンストラクション関数を呼び出してオブジェクトを作成–delete 1、コンストラクション関数を呼び出してオブジェクトを破棄する2、メモリ領域を回収(デフォルトはスタック領域)newまたはdelete操作にかかわらず、newとdelete操作は対称です.
C++のnew/deleteオペレータは再ロードできます.–グローバル・リロード(推奨しない)–ローカル・リロード(特定のクラスでリロード)C++をリロードするnew/deleteオペレータは、動的にオブジェクトを作成するときのメモリの割り当て方法を変更することを意味します.
【new/deleteのリロード方式】
【プログラミング実験】静的記憶領域に動的オブジェクトを作成する
VS 2015実行結果:
【プログラミング実験】指定したメモリアドレスに動的オブジェクトを作成する
C++のnew/deleteオペレータは再ロードできます.–グローバル・リロード(推奨しない)–ローカル・リロード(特定のクラスでリロード)C++をリロードするnew/deleteオペレータは、動的にオブジェクトを作成するときのメモリの割り当て方法を変更することを意味します.
【new/deleteのリロード方式】
void* operator new (unsigned int size)
{
void* ret = NULL;
//To do...
return ret;
}
void operator delete(void* p)
{
//To do...
}
【プログラミング実験】静的記憶領域に動的オブジェクトを作成する
/*testMem.h
* new/delete
*
*/
#include
#include
using namespace std;
class test
{
static const unsigned int count = 4;// N ?
static char c_buffer[];//
static char c_map[];//
public:
void* operator new (unsigned int size)
{
void* ret = NULL;
for (int i = 0; i < count; i++)
{
if (!c_map[i])// 0, 1
{
c_map[i] = 1;//
ret = c_buffer + i * sizeof(test);// c_buffer
cout << "new success:"<< ret << endl;
break;//
}
}
return ret;
}
void operator delete(void* p)
{
if (p != NULL)
{
char* mem = reinterpret_cast<char*>(p);// void*
int index = (mem - c_buffer) / sizeof(test);// c_map
int flag = (mem - c_buffer) % sizeof(test);// test
if (flag == 0 && index >= 0 && index < count)//
{
c_map[index] = 0;//
cout << "delete success:"<< p << endl;
}
}
}
};
char test::c_buffer[test::count * sizeof(test)] = {0};//
char test::c_map[test::count] = {0};//
//main.cc
#include "testMem.h"
#include
using namespace std;
int main()
{
test* p = new test;
delete p;
return 0;
}
VS 2015実行結果:
new success:00F7B138
delete success:00F7B138
【プログラミング実験】指定したメモリアドレスに動的オブジェクトを作成する