Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Lebih suka objek tercakup, jangan alokasikan tumpukan yang tidak perlu (r.5)
Untuk menghindari penggunaan pointer yang tidak perlu, kami mencoba mendeteksi pola umum alokasi lokal. Misalnya, kami mendeteksi kapan hasil panggilan ke operator new disimpan dalam variabel lokal dan kemudian dihapus secara eksplisit. Pemeriksaan ini mendukung aturan Pedoman Inti C++ R.5: Lebih suka objek tercakup, jangan alokasikan timbunan yang tidak perlu. Untuk memperbaiki masalah, gunakan jenis RAII alih-alih pointer mentah, dan izinkan untuk menangani sumber daya. Jelas, tidak perlu membuat jenis pembungkus untuk mengalokasikan satu objek. Sebaliknya, variabel lokal dari jenis objek akan bekerja lebih baik.
Keterangan
Untuk mengurangi jumlah peringatan, analisis kode hanya mendeteksi pola ini untuk penunjuk pemilik. Jadi, perlu menandai pemilik dengan benar terlebih dahulu. Kami dapat dengan mudah memperluas analisis ini untuk mencakup pointer mentah jika kami menerima umpan balik tentang Komunitas Pengembang Visual Studio C++ dari pelanggan yang mendukung skenario tersebut.
Istilah objek tercakup mungkin agak menyesatkan. Secara umum, kami sarankan Anda menggunakan variabel lokal yang masa pakainya dikelola secara otomatis, atau objek pintar yang mengelola sumber daya dinamis secara efisien. Objek pintar dapat melakukan alokasi tumpukan, tetapi tidak eksplisit dalam kode.
Jika peringatan diaktifkan pada alokasi array, yang sering diperlukan untuk buffer dinamis, Anda dapat memperbaikinya dengan menggunakan kontainer standar, atau
std::unique_pointer<T[]>.Pola hanya terdeteksi untuk variabel lokal. Kami tidak memperingatkan dalam kasus di mana alokasi ditetapkan, misalnya, variabel global lalu dihapus dalam fungsi yang sama.
Nama analisis kode: DONT_HEAP_ALLOCATE_UNNECESSARILY
Contoh 1: Alokasi objek yang tidak perlu pada timbunan
auto tracer = new Tracer();
ScanObjects(tracer);
delete tracer; // C26407
Contoh 2: Alokasi objek yang tidak perlu pada tumpukan (diperbaiki dengan objek lokal)
Tracer tracer; // OK
ScanObjects(&tracer);
Contoh 3: Alokasi buffer yang tidak perlu pada timbunan
auto value = new char[maxValueSize];
if (ReadSetting(name, value, maxValueSize))
CheckValue(value);
delete[] value; // C26407
Contoh 4: Alokasi buffer yang tidak perlu pada tumpukan (diperbaiki dengan kontainer)
auto value = std::vector<char>(maxValueSize); // OK
if (ReadSetting(name, value.data(), maxValueSize))
CheckValue(value.data());