Placement-Newを使用した機構でコンパイラの警告が気になります

解決


KuroE−S  2004-12-12 23:19:42  No: 55643

Win2k VC6.0 コンソールアプリケーション

この環境でPlacement-Newを使ったコードをコンパイルすると

  warning C4291:
    'void *__cdecl CBase::operator new(unsigned int,void *)' :
    初期化コードが例外をスローすると、'new' 演算子を使用していると
    メモリを解放しません。

上記のエラーを吐き出します。実行もできてメモリリークも起きて居らず
、それにcountUp関数で変数を思い通りにカウントアップさせることが出来
ました。ですので無視しようとも思いましたが、やはり警告は警告ですので
原因もわからぬまま先へは進みたくありません。
よろしければ「なぜこのような警告が出るのか?」を知りたいのですが
調べた限りの文献、資料の範疇ではありませんでした。
それと、内容に不十分な部位がありましたらお訊き下さい。
助力していただきますことを願っております、宜しくお願いいたします。

///////////////////////////////////////////////////////////////
// 定義部分

#include <windows.h>
#include <iostream.h>

typedef class CBase * pCBase;

class CBase
{
protected:

  DWORD m_dwCount;

public:

  DWORD getCount ( void )
  {
    return m_dwCount;
  }

  virtual void countUp ( void )
  {
  }

  PVOID operator new ( size_t uSize )
  {
    return ::operator new ( uSize );
  }

  void operator delete ( PVOID lpvAddr )
  {
    delete lpvAddr;
  }

  PVOID operator new ( size_t uSize, PVOID lpvAddr )
  {
    return lpvAddr;
  }

  void operator delete ( PVOID lpvAddr, size_t uSize )
  {
    delete lpvAddr;
  }

};

class CInitialize : public CBase
{
public:

  CInitialize()
  {
    m_dwCount = 0;
  }

  void countUp ( void )
  {
    m_dwCount += 1;
  }

};

class CCountUp2 : public CBase
{
  void countUp ( void )
  {
    m_dwCount += 2;
  }
};

///////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////
// 呼び出し部分

pCBase base = new CInitialize;

base->countUp();

base = new ( base ) CCountUp2;

base->countUp();

cout << "Count : " << base->getCount() << endl;

delete base;

///////////////////////////////////////////////////////////////


なーめ  2004-12-13 01:34:03  No: 55644

私は placement-new は使わないのですが、
検索すると、説明している方がいます。
http://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new-2.html
new と delete が非対称だから、ということかな。


KuroE−S  2004-12-13 08:15:52  No: 55645

なーめさん、提示していただいた資料を再度見直してみたら
私の理解に穴が空いていました、お恥ずかしいです。

引数の整合性をとることを見落としていましたので再度書き直し
ましたらコンパイラは文句を言わなくなりました。

改めて感謝いたします、ありがとうございました


たく  2004-12-13 23:26:21  No: 55646

解決されてますが、

>  warning C4291:
>    'void *__cdecl CBase::operator new(unsigned int,void *)' :
>    初期化コードが例外をスローすると、'new' 演算子を使用していると
>    メモリを解放しません。

C4291を選択してF1キーを押すと、詳細が表示されます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加