আমি জিসিসি 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).
আমি ভিজ্যুয়াল সি ++ ( Microsoft (R) C/C++ Optimizing Compiler Version 19.24.28314 for x64
) এর সাথে কোনও মেমরি ফাঁস দেখতে পাচ্ছি না ।
এটি কি unordered_map::insert
( https://stackoverflow.com/a/11699271/1958315 ) এর দৃ exception় ব্যতিক্রমের সুরক্ষা গ্যারান্টিটি ভঙ্গ করে ? এটি কি জিসিসি এসটিএলে একটি বাগ আছে?
std::unordered_map::insert
পরিষ্কার স্পষ্টভাবে বলা হয়েছে "1-4) যদি কোনও অপারেশন দ্বারা ব্যতিক্রম ছুঁড়ে ফেলা হয় তবে সন্নিবেশটির কোনও প্রভাব নেই।" (জোর দেওয়া আমার) এখান থেকে en.cppreferences.com/w/cpp/container/unordered_map/insert