new&delete関数のラッパー関数作成方法

[戻る]
のり [E-Mail] 2002/11/26(火) 09:28:57
malloc&free関数で

int count=0;
main{
 int *x;
 x = (int *)MyMalloc(sizeof(int));
 MyFree(x);
}

void * MyMalloc(int size){
  count++;
  return malloc(size);
}

void MyFree(void *ptr){
  free(ptr);
  count--;
  return;
}
といったことをやって簡単なメモリリークチェックをしているのですが、
同じ事をnew&deleteでもmyNew,myDeleteを作成して試したいのですが、
どうやってその関数を作成したらよいのかが分かりません。
(C++の場合コンストラクターなどがあるので単に指定されたサイズだけ
 メモリー領域を確保するだけじゃだめですよね?)
分かる方はそのような関数の作成方法を教えてください。

かんな 2002/11/26(火) 09:59:32
new,delete演算子をオーバーロード

のり [E-Mail] 2002/11/26(火) 15:25:52
かんな さんご返答ありがとうございます。

new,delete演算子をオーバーロード
との事ですが、それは
void *operator new(size_t size){
  count++:
  return malloc(size);
}

とかってすることですよね?
この場合、この定義を参照している演算子newを使用しているもの全て
がcount++の対象となってしまうと思うのですが、
私は可能ならば
newと同じ意味のmyNewなどという演算子を作成し、
newを使用した場合は単なるnew
myNewを使用した場合はnew&count++をする
としたいのですが、このようなことは不可能なのでしょうか?

不勉強なだけかもしれませんが、よろしくお願いします。

YuO [E-Mail] 2002/11/26(火) 16:51:59
組み込み型でも行いたいのであれば,基本的に無理だと考えてください。
特定のクラス型のみで,常にカウントするのでよければ,
基底クラスにoperator newとoperator deleteを用意してやるだけです。

ところで,
std::auto_ptr
とか,
boost::shared_ptr/boost::scoped_ptr/boost::shared_array/boost::scoped_array
といったスマートポインタを用いて,
deleteのタイミングをコンパイラにまかせてしまうことはできないのですか?
#std::vectorとかstd::stringなんてのも使えないでしょうかね。

dairygoods 2002/11/26(火) 17:26:59
newと同じ構文でなくても良いなら、こんなのはどうでしょう。
#コンストラクタに引数を渡したい場合は、
#template<class T, class U> T* mynew(U u)などと引数付きを
#いくつか作って凌ぐ(^^;

template<class T> T* mynew(){
  count++;
  return new T();
}

int* pnum = mynew<int>();


どうしてもnewと同じ構文で書きたいなら、こんなのとか。
#deleteは無理ですね…

enum DummyArg { _dummy };
void* operator new(size_t size, DummyArg dummy){
  return ::operator new(size);
}
#define mynew new(_dummy)

のり [E-Mail] 2002/11/27(水) 16:27:14
[[解決]]
やはりVC環境でないとちょっと難しいことが分かりました。

ご返信してくれた方々ありがとうございました

古いスレッドには追加発言できません。