Aracılığıyla paylaş


Uyarı C26401

(örneğin, 11) olmayan bir owner<T> ham işaretçiyi silmeyin

Açıklamalar

Bu denetim, taşımanın owner<T> yeniden düzenlemenin ilk aşaması için iyi bir seçenek olabileceği kodu algılar. C26400 gibi I.11 ve R.3 kurallarını zorunlu kılar, ancak işaretçi ömrünün "yayın" bölümüne odaklanır. Hedef bir veya örtük olarak varsayılmış bir owner<T> sahip değilse, herhangi bir çağrı işlecinde delete uyarır. Bildirimler hakkında auto daha fazla bilgi için bkz . C26400. Bu denetim genel değişkenlere, resmi parametrelere vb. başvuran ifadeleri içerir.

C26400 ve C26401 uyarıları her zaman C26409 ile gerçekleşir, ancak akıllı işaretçilere anında geçişin mümkün olmadığı senaryolar için daha uygundur. Bu gibi durumlarda, owner<T> kavram önce benimsenebilir ve C26409 geçici olarak gizlenebilir.

Kod analizi adı: DONT_DELETE_NON_OWNER

Ayrıca bkz.

C++ Temel Yönergeleri I.11

Örnekler

struct myStruct {};

myStruct* createMyStruct();
void function()
{
    myStruct* pMyStruct = createMyStruct();
    // ...
    delete pMyStruct; // C26401. Do not delete a raw pointer that is not an owner<T>
}

İşaretçinin sahipliği gsl::owner tarafından gösteriliyorsa C26401'in kaldırıldığını görün.

#include <gsl/pointers>
struct myStruct {};

gsl::owner<myStruct*> createMyStruct();
void function()
{
    gsl::owner<myStruct*> pMyStruct = createMyStruct();
    // ...
    delete pMyStruct; // no warning.
}

Şu uyarıyı tetikleyen bir C++ deyimi vardır: delete this. C++ Çekirdek Yönergeleri bu düzeni engellemediğinden uyarı kasıtlı olarak yapılır. Bu örnekte gösterildiği gibi özniteliğini kullanarak uyarıyı gsl::suppress gizleyebilirsiniz:

class MyReferenceCountingObject final
{
public:
    void AddRef();
    void Release() noexcept
    {
        ref_count_--;
        if (ref_count_ == 0)
        {
            [[gsl::suppress(i.11)]]
            delete this; 
        }
    }
private:
    unsigned int ref_count_{1};
};