メインコンテンツ

AUTOSAR C++14 Rule A18-5-11

"operator new" and "operator delete" shall be defined together

説明

ルール定義

"operator new" and "operator delete" shall be defined together.

根拠

通常、空きストアのメモリの割り当てに加えて何らかのブックキーピングを実行するために operator new をオーバーロードします。対応する operator delete をオーバーロードしていない場合は、メモリの割り当てを解除するときに対応するブックキーピングを省略した可能性があります。

この欠陥もコーディング エラーを示す可能性があります。たとえば、operator new[] の配置形式をオーバーロードしたとします。

void *operator new[](std::size_t count, void *ptr);
次のように operator delete[] の非配置形式を使用してしまう場合があります。
void operator delete[](void *ptr);
この場合は次の配置形式でなければなりません。
void operator delete[](void *ptr, void *p );

operator new をオーバーロードする際、対応する operator delete を同じスコープでオーバーロードしていることを確認します (その逆も同様)。operator new に対応する operator delete を見つける方法については、operator new および operator delete のリファレンス ページを参照してください。

Polyspace 実装

ルール チェッカーは、operator new をオーバーロードしたが対応する operator delete をオーバーロードしていない場合 (またはその逆の場合) に違反を報告します。

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include <new>
#include <cstdlib>

int global_store;

void update_bookkeeping(void *allocated_ptr, bool alloc) {
   if(alloc) 
      global_store++;
   else
      global_store--;
}


void *operator new(std::size_t size, const std::nothrow_t& tag);
void *operator new(std::size_t size, const std::nothrow_t& tag) //Noncompliant
{
    void *ptr = (void*)malloc(size);
    if (ptr != nullptr)
        update_bookkeeping(ptr, true);
    return ptr;
}

void operator delete[](void *ptr, const std::nothrow_t& tag);
void operator delete[](void* ptr, const std::nothrow_t& tag) //Noncompliant
{
    update_bookkeeping(ptr, false);
    free(ptr); 
}

この例では、演算子 operator new および operator delete[] はオーバーロードされていますが、対応する operator delete および operator new[] 演算子のオーバーロードがないので、準拠していません。

operator new のオーバーロードは、関数 update_bookkeeping を呼び出してグローバル変数 global_store の値を変更します。既定の operator delete が呼び出された場合、このグローバル変数は影響を受けませんが、これは開発者の想定に反する可能性があります。

チェック情報

グループ: 言語サポート ライブラリ
カテゴリ: Required、Automated

バージョン履歴

R2020b で導入

すべて展開する