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;
///////////////////////////////////////////////////////////////
私は placement-new は使わないのですが、
検索すると、説明している方がいます。
http://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new-2.html
new と delete が非対称だから、ということかな。
なーめさん、提示していただいた資料を再度見直してみたら
私の理解に穴が空いていました、お恥ずかしいです。
引数の整合性をとることを見落としていましたので再度書き直し
ましたらコンパイラは文句を言わなくなりました。
改めて感謝いたします、ありがとうございました
解決されてますが、
> warning C4291:
> 'void *__cdecl CBase::operator new(unsigned int,void *)' :
> 初期化コードが例外をスローすると、'new' 演算子を使用していると
> メモリを解放しません。
C4291を選択してF1キーを押すと、詳細が表示されます。
ツイート | ![]() |