Unordered_map के दौरान मेमोरी लीक :: GCC के साथ KeyEqual अपवाद डालें - मजबूत अपवाद सुरक्षा गारंटी को तोड़ना?


10

मैं जीसीसी 7.3.1 का उपयोग कर रहा हूं, लेकिन कोलीरू पर भी परीक्षण किया गया है, जो मुझे लगता है कि संस्करण 9.2.0 है। निम्नलिखित के साथ बनाएँ:

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

यहाँ है 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";
    }
}

इसके परिणाम स्वरूप:

> ./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).

मुझे विज़ुअल C ++ ( Microsoft (R) C/C++ Optimizing Compiler Version 19.24.28314 for x64) के साथ कोई मेमोरी लीक नहीं दिख रहा है ।

क्या यह unordered_map::insert( https://stackoverflow.com/a/11699271/1958315 ) की मजबूत अपवाद सुरक्षा गारंटी को तोड़ता है ? क्या यह जीसीसी एसटीएल में एक बग है?


एसटीएल केवल उन अपवादों को पकड़ने जा रहा है जो इसे उत्पन्न करता है (यदि यह हो सकता है)। यह आपके खिलाफ पहरा देने वाला नहीं है, यह अपरिवर्तनीय है। अच्छा CPPCON इसके बारे में बात करता है: youtube.com/…
NathanOliver

1
@ NathanOliver-ReinstateMonica को दस्तावेज़ीकरण को संभवतः अपडेट करने की आवश्यकता है, जैसा कि std::unordered_map::insertस्पष्ट रूप से कहा जाता है "1-4) यदि किसी ऑपरेशन के द्वारा अपवाद को फेंक दिया जाता है , तो सम्मिलन का कोई प्रभाव नहीं पड़ता है।" (जोर मेरा है) यहाँ से en.cppreference.com/w/cpp/container/unordered_map/insert
Slava

इस प्रोग्राम को चलाने के दौरान libc ++ कोई मेमोरी लीक नहीं करता है।
मार्शल क्लो

@ NathanOliver-ReinstateMonica यह बकवास है। मानक पुस्तकालय को उपयोगकर्ता के प्रकारों के अपवादों को संभालना होता है। यहां कोई टूटा हुआ आक्रमणकारी नहीं है।
जोनाथन वेकली

@ राय यह एक बग है, कृपया इसे gcc.gnu.org/bugs की
जोनाथन

जवाबों:


2

मानक द्वारा अनिवार्य गारंटी (नवीनतम ड्राफ्ट से उद्धरण):

[Container.requirements.general]

जब तक अन्यथा निर्दिष्ट न हो (देखें [सहयोगी.reqmts.except], [unord.req.except], [deque.modifiers], और [वेक्टर.modifiers]) इस खंड में परिभाषित सभी कंटेनर प्रकार निम्नलिखित अतिरिक्त आवश्यकताओं को पूरा करते हैं:

  • यदि किसी एकल तत्व को सम्मिलित करते समय एक इंसर्ट () या एमप्ले () फ़ंक्शन द्वारा एक अपवाद को फेंक दिया जाता है, तो उस फ़ंक्शन का कोई प्रभाव नहीं होता है।

[Associative.reqmts.except]

साहचर्य कंटेनरों के लिए, यदि कोई अपवाद किसी भी ऑपरेशन से किसी भी ऑपरेशन के द्वारा किसी एक तत्व को सम्मिलित करते हुए फेंक दिया जाता है, तो सम्मिलन का कोई प्रभाव नहीं पड़ता है।

[Unord.req.except]

अनियंत्रित साहचर्य कंटेनरों के लिए, यदि कोई अपवाद किसी भी तत्व द्वारा कंटेनर के हैश फ़ंक्शन के अलावा किसी भी ऑपरेशन द्वारा फेंका जाता है या एकल तत्व डालने वाले फ़ंक्शन को सम्मिलित करता है, तो सम्मिलन का कोई प्रभाव नहीं पड़ता है।

जहां तक ​​मैं समझता हूं, "कोई प्रभाव नहीं" का अर्थ है "कोई स्मृति रिसाव नहीं"। ऐसी व्याख्या के तहत, मैं एक रिसाव को बग होने पर विचार करूंगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.