Unordered_map :: sırasında bellek sızıntısı


10

GCC 7.3.1 kullanıyorum, ancak 9.2.0 sürümü olduğuna inandığım coliru üzerinde de test yaptım. Aşağıdakilerle derleyin:

g++ -fsanitize=address -fno-omit-frame-pointer rai.cpp

İşte rai.cpp:

#include <iostream>
#include <unordered_map>

int main()
{
    try
    {
        struct MyComp {
            bool operator()(const std::string&, const std::string&) const {
                throw std::runtime_error("Nonono");
            }
        };

        std::unordered_map<std::string, std::string, std::hash<std::string>, MyComp> mymap;
        mymap.insert(std::make_pair("Hello", "There"));
        mymap.insert(std::make_pair("Hello", "There")); // Hash match forces compare
    } catch (const std::exception& e) {
        std::cerr << "Caught exception: " << e.what() << "\n";
    }
}

Çalıştırılmasıyla sonuçlanır:

> ./a.out
Caught exception: Nonono

=================================================================
==72432==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 32 byte(s) in 1 object(s) allocated from:
...

Direct leak of 4 byte(s) in 1 object(s) allocated from:
...

Indirect leak of 60 byte(s) in 2 object(s) allocated from:
...

SUMMARY: AddressSanitizer: 96 byte(s) leaked in 4 allocation(s).

Visual C ++ ( Microsoft (R) C/C++ Optimizing Compiler Version 19.24.28314 for x64) ile bellek sızıntıları görmüyorum .

Bu, unordered_map::insert( https://stackoverflow.com/a/11699271/1958315 ) gibi güçlü istisna güvenlik garantisini bozuyor mu? Bu GCC STL'de bir hata mı?


STL yalnızca ürettiği istisnaları yakalayacaktır (eğer yapabilirse). Bu değişmez kırma sana karşı koruma olmaz. İyi CPPCON bunun hakkında konuşur: youtube.com/…
NathanOliver

1
@ NathanOliver-ReinstateMonica muhtemelen std::unordered_map::insert"1-4) açıkça belirttiği gibi belgelerin güncellenmesi gerekiyor " Herhangi bir işlem tarafından bir istisna atılırsa , eklemenin bir etkisi olmaz. " (vurgu benim) buradan en.cppreference.com/w/cpp/container/unordered_map/insert
Slava

libc ++ bu programı çalıştırırken bellek sızdırmaz.
Marshall Clow

@ NathanOliver-ReinstateMonica bu saçmalık. Standart kütüphane, kullanıcının tanımladığı türden istisnaları işlemelidir. Burada kırık bir değişmez yoktur.
Jonathan Wakely

@Rai bu bir hata, lütfen bildirin gcc.gnu.org/bugs
Jonathan Wakely

Yanıtlar:


2

Standart tarafından zorunlu kılınan garanti (son taslaktan alıntılar):

[Container.requirements.general]

Aksi belirtilmedikçe (bkz. [Associative.reqmts.except], [unord.req.except], [deque.modifiers] ve [vector.modifiers]) bu Maddede tanımlanan tüm kap tipleri aşağıdaki ek gereksinimleri karşılamaktadır:

  • tek bir öğe eklenirken bir insert () veya emplace () işlevi tarafından bir istisna atılırsa, bu işlevin etkisi olmaz.

[Associative.reqmts.except]

İlişkili kaplar için, tek bir öğe ekleyen bir ekleme veya yerleştirme işlevinden herhangi bir işlem tarafından bir özel durum atılırsa, eklemenin bir etkisi olmaz.

[Unord.req.except]

Sırasız ilişkisel kaplar için, tek bir öğeyi ekleyen kabın karma işlevinden başka bir işlem tarafından bir özel durum atılırsa, eklemenin bir etkisi olmaz.

Anladığım kadarıyla "hiçbir etkisi yoktur", "bellek sızıntısı yok" anlamına gelir. Böyle bir yorumda, bir sızıntının bir hata olduğunu düşünürdüm.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.