メインコンテンツ

AUTOSAR C++14 Rule A18-5-4

If a project has sized or unsized version of operator 'delete' globally defined, then both sized and unsized versions shall be defined

説明

ルール定義

プロジェクトでサイズ指定ありまたはサイズ指定なしのバージョンの演算子 'delete' がグローバルに定義されている場合は、サイズ指定ありとサイズ指定なしの両方のバージョンを定義するものとします。

根拠

C++14 規格ではサイズ指定ありバージョンの operator delete を定義しています。たとえば、次のシグネチャをもつサイズ指定なしの operator delete について考えます。

void operator delete (void* ptr);
サイズ指定ありバージョンには、追加のサイズ引数があります。
void operator delete (void* ptr, std::size_t size);
operator delete の C++ リファレンス ページを参照してください。

標準では、operator delete の両方のバージョンが存在する場合は、サイズ指定ありのバージョンを呼び出す必要があることになっています。これは、メモリ割り当てを解除するためのより効率的な方法が提供されるためです。ただし、不完全な型を削除するためなど、場合によっては、サイズ指定なしのバージョンを使用します。

サイズ指定なしのバージョンの operator delete をオーバーロードする場合、サイズ指定ありのバージョンもオーバーロードしなければなりません。通常、空きストアのメモリの割り当て解除に加えてブックキーピングを実行するために operator delete をオーバーロードします。サイズ指定なしのバージョンをオーバーロードして、サイズ指定ありのバージョンをオーバーロードしない (またはその逆の) 場合は、一方のバージョンで実行したブックキーピングがもう一方のバージョンでは行われません。この省略は予期しない結果につながる可能性があります。

Polyspace 実装

チェッカーは、サイズ指定なしのバージョンの operator delete が存在しているものの、対応するサイズ指定ありのバージョンが定義されていない (またはその逆の) 状況にフラグを設定します。

チェッカーは、C++14 以降の C++ バージョンを指定した場合にのみ有効になります。C++ 標準バージョン (-cpp-version) を参照してください。

トラブルシューティング

ルール違反が想定されるものの、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 delete(void *ptr);
void operator delete(void* ptr) {
    update_bookkeeping(ptr, false);
    free(ptr); 
}

void operator delete(void *ptr, std::size_t size);
void operator delete(void* ptr, std::size_t size) { 
    //Compliant, both sized and unsized version defined
    update_bookkeeping(ptr, false);
    free(ptr); 
}

void operator delete[](void *ptr);
void operator delete[](void* ptr) { //Noncompliant, only unsized version defined
    update_bookkeeping(ptr, false);
    free(ptr); 
}

この例では、サイズ指定なしとサイズ指定ありの両方のバージョンの operator delete がオーバーロードされ、ルールに従っています。ただし、サイズ指定なしのバージョンの operator delete[] のみがオーバーロードされており、これはルールに違反しています。

チェック情報

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

バージョン履歴

R2019a で導入