簡體   English   中英

為什么Valgrind在此實現中報告內存泄漏?

[英]Why does Valgrind report a memory leak in this implementation?

我有以下一段C ++代碼,其中我正在嘗試執行一個例程:

#include <thread>
#include <unistd.h>
#include <sys/wait.h>
#include <memory>

using namespace std;

static void upload(const string url, const string path){ int sync_status;}

int main(){
    bool flag = true;
    for(int worker_id = 0; worker_id < 1; worker_id++){
        int worker_pid = fork();
        if (worker_pid == 0){
            while (true){
                std::unique_ptr<std::thread> uploader(nullptr);
                if (flag){       // This block only occurs once inside while loop
                    flag = false;
                    string path = "l", url = "k";
                    // Valgrind reports the next line
                    uploader = std::make_unique<std::thread>(upload, url, path);
                }
                int child_id = fork();
                if (!child_id){
                    // Do something
                    exit(0);
                }
                waitpid(child_id, NULL, 0);
                if(uploader && uploader->joinable()){
                    uploader->join();
                }
            }
            // Do something
            exit(0);
        }
    }
    return 0;
}

但是valgrind似乎總是報告以下代碼:

==16424== 80 bytes in 1 blocks are definitely lost in loss record 2 of 2
==16424==    at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==16424==    by 0x10AA39: std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> > std::thread::_S_make_state<std::thread::_Invoker<std::tuple<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >(std::thread::_Invoker<std::tuple<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&&) (thread:197)
==16424==    by 0x10A04A: std::thread::thread<void (&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>(void (&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (thread:126)
==16424==    by 0x109A64: std::_MakeUniq<std::thread>::__single_object std::make_unique<std::thread, void (&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>(void (&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (unique_ptr.h:825)
==16424==    by 0x109514: main (main.cpp:21)

泄漏的原因是什么? 我以為這是由於exit()調用引起的,但是即使在調用之前加入unique_ptr也無濟於事。

您可以在[basic.start.main]中找到此句子:

在不離開當前塊的情況下終止程序(例如,通過調用函數std​::​exit(int) ([support.start.term]))不會破壞具有自動存儲持續時間的任何對象([class.dtor]) 。

因此,您的unique_ptr分叉副本將永遠不會被破壞。 那就是泄漏的valgrind報告。

試圖銷毀一個unique_ptr兩個副本也不是一個好主意。 因此,此示例的設計中可能存在更深的缺陷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM