C++ Error: double free or corruption. Thread. File. Exception. Lambda.

280
05 марта 2018, 00:57

Ожидал вывод "Exception opening file" и "Exception get line" каждые 5 секунд.

    //
    // Created by cucaracha on 02.03.18.
    //
#include <iostream>
#include <fstream>
#include <thread>
#include <chrono>
#include <algorithm>
#include <condition_variable>
#include <queue>
struct SFunctorReadLineFromFile
{
    void Open(std::string strNameFile)
    {
        m_ifFile.exceptions(std::ifstream::failbit | std::ifstream::badbit );
        try
        {
            m_ifFile.open(strNameFile);
            m_ifFile.is_open();
        }
        catch(const std::fstream::failure & e)
        {
            std::cerr << "Exception opening file" << std::endl;
        }
    }
    std::string operator()()
    {
        try
        {
            std::getline(m_ifFile, m_strLine);
            std::cout<<m_strLine<<"\n";
            return m_strLine;
        }
        catch(const std::fstream::failure & e)
        {
            std::cout << "Exception get line" << std::endl;
        }
    }
    std::ifstream m_ifFile;
    std::string m_strLine;
};
class CExcutor
{
public:
    virtual ~ CExcutor() = default;
    virtual void Excute(const std::function<void()> & functor) = 0;
};
class CWorkerThread
{
public:
    CWorkerThread()
            : m_bDone(false)
    {
        m_Thread = std::thread(&CWorkerThread::Start, this);
    }
    ~CWorkerThread()
    {
        Shutdown();
    }
    void Push(const std::function<void()> & rFunctor)
    {
        {
            std::lock_guard<std::mutex> lock(m_Mutex);
            m_quFunctors.push(rFunctor);
        }
        m_CondVar.notify_one();
    }
    void Shutdown()
    {
        {
            std::lock_guard<std::mutex> lock(m_Mutex);
            m_bDone = true;
        }
        m_CondVar.notify_one();
        m_Thread.join();
    }
private:
    void Start()
    {
        for(;;)
        {
            std::function<void()> functor;
            {
                std::unique_lock<std::mutex> lock(m_Mutex);
                m_CondVar.wait(lock, [this]{
                    return m_bDone || !m_quFunctors.empty();
                });
                if (m_bDone && m_quFunctors.empty()) {
                    break;
                }
                functor = m_quFunctors.front();
                m_quFunctors.pop();
            }
            functor();
        }
    }
    bool m_bDone;
    std::condition_variable m_CondVar;
    std::mutex m_Mutex;
    std::thread m_Thread;
    std::queue<std::function<void()>> m_quFunctors;
};
class CParallel : public CExcutor
{
public:
    void Excute(const std::function<void()> & functor) override
    {
        m_cWorkerThread.Push(functor);
    }
private:
    CWorkerThread m_cWorkerThread;
};
int main(int argc, char * argv[])
{
    SFunctorReadLineFromFile * functor = new  SFunctorReadLineFromFile;
        functor->Open("");
    auto  parallel = std::make_shared<CParallel>();
    while(true) {
        parallel->Excute([functor]{ (*functor)(); });
        std::this_thread::sleep_for(std::chrono::seconds(5));
    }
    return 0;
}

Вывод:

/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow Exception opening file Exception get line * Error in `/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow': double free or corruption (out): 0x00007f5a3aeacd90 * ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f5a3b22e7e5] /lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7f5a3b23737a] /lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f5a3b23b53c] /home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x401b43] /home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x401df8] /home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x40310c] /home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x402ab5] /home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x406ff1] /home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x406f85] /home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x406e58] /home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow[0x406da8] /usr/lib/x86_64-linux-gnu/libstdc++.so.6(+0xb8c80)[0x7f5a3ba6cc80] /lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba)[0x7f5a3b5886ba] /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7f5a3b2be41d] ======= Memory map: ======== 00400000-0040c000 r-xp 00000000 08:07 2764864
/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow 0060b000-0060c000 r--p 0000b000 08:07 2764864
/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow 0060c000-0060d000 rw-p 0000c000 08:07 2764864
/home/cucaracha/MyProjects/StackOverflow/cmake-build-debug/StackOverflow 0231f000-02351000 rw-p 00000000 00:00 0
[heap] 7f5a34000000-7f5a34021000 rw-p 00000000 00:00 0 7f5a34021000-7f5a38000000 ---p 00000000 00:00 0 7f5a3a6ad000-7f5a3a6ae000 ---p 00000000 00:00 0 7f5a3a6ae000-7f5a3aeae000 rw-p 00000000 00:00 0 7f5a3aeae000-7f5a3afb6000 r-xp 00000000 08:05 409560
/lib/x86_64-linux-gnu/libm-2.23.so 7f5a3afb6000-7f5a3b1b5000 ---p 00108000 08:05 409560
/lib/x86_64-linux-gnu/libm-2.23.so 7f5a3b1b5000-7f5a3b1b6000 r--p 00107000 08:05 409560
/lib/x86_64-linux-gnu/libm-2.23.so 7f5a3b1b6000-7f5a3b1b7000 rw-p 00108000 08:05 409560
/lib/x86_64-linux-gnu/libm-2.23.so 7f5a3b1b7000-7f5a3b377000 r-xp 00000000 08:05 409564
/lib/x86_64-linux-gnu/libc-2.23.so 7f5a3b377000-7f5a3b577000 ---p 001c0000 08:05 409564
/lib/x86_64-linux-gnu/libc-2.23.so 7f5a3b577000-7f5a3b57b000 r--p 001c0000 08:05 409564
/lib/x86_64-linux-gnu/libc-2.23.so 7f5a3b57b000-7f5a3b57d000 rw-p 001c4000 08:05 409564
/lib/x86_64-linux-gnu/libc-2.23.so 7f5a3b57d000-7f5a3b581000 rw-p 00000000 00:00 0 7f5a3b581000-7f5a3b599000 r-xp 00000000 08:05 409563 /lib/x86_64-linux-gnu/libpthread-2.23.so 7f5a3b599000-7f5a3b798000 ---p 00018000 08:05 409563 /lib/x86_64-linux-gnu/libpthread-2.23.so 7f5a3b798000-7f5a3b799000 r--p 00017000 08:05 409563
/lib/x86_64-linux-gnu/libpthread-2.23.so 7f5a3b799000-7f5a3b79a000 rw-p 00018000 08:05 409563
/lib/x86_64-linux-gnu/libpthread-2.23.so 7f5a3b79a000-7f5a3b79e000 rw-p 00000000 00:00 0 7f5a3b79e000-7f5a3b7b4000 r-xp 00000000 08:05 397309 /lib/x86_64-linux-gnu/libgcc_s.so.1 7f5a3b7b4000-7f5a3b9b3000 ---p 00016000 08:05 397309
/lib/x86_64-linux-gnu/libgcc_s.so.1 7f5a3b9b3000-7f5a3b9b4000 rw-p 00015000 08:05 397309
/lib/x86_64-linux-gnu/libgcc_s.so.1 7f5a3b9b4000-7f5a3bb26000 r-xp 00000000 08:05 1306005
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 7f5a3bb26000-7f5a3bd26000 ---p 00172000 08:05 1306005
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 7f5a3bd26000-7f5a3bd30000 r--p 00172000 08:05 1306005
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 7f5a3bd30000-7f5a3bd32000 rw-p 0017c000 08:05 1306005
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 7f5a3bd32000-7f5a3bd36000 rw-p 00000000 00:00 0 7f5a3bd36000-7f5a3bd5c000 r-xp 00000000 08:05 409562
/lib/x86_64-linux-gnu/ld-2.23.so 7f5a3bf39000-7f5a3bf3f000 rw-p 00000000 00:00 0 7f5a3bf5a000-7f5a3bf5b000 rw-p 00000000 00:00 0 7f5a3bf5b000-7f5a3bf5c000 r--p 00025000 08:05 409562
/lib/x86_64-linux-gnu/ld-2.23.so 7f5a3bf5c000-7f5a3bf5d000 rw-p 00026000 08:05 409562
/lib/x86_64-linux-gnu/ld-2.23.so 7f5a3bf5d000-7f5a3bf5e000 rw-p 00000000 00:00 0 7ffd9b5f2000-7ffd9b613000 rw-p 00000000 00:00 0
[stack] 7ffd9b6c5000-7ffd9b6c8000 r--p 00000000 00:00 0
[vvar] 7ffd9b6c8000-7ffd9b6ca000 r-xp 00000000 00:00 0
[vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0
[vsyscall]

Process finished with exit code 134 (interrupted by signal 6: SIGABRT)

Answer 1

В случае, когда происходит исключение, std::string operator()() возвращает мусор вместо объекта, приводя к неопределенному поведению. При попытке выполнить деструктор этого объекта вызывающий код скорее всего упадает.

READ ALSO
Arduino timeout communicating with programmer error

Arduino timeout communicating with programmer error

При загрузке простейшего блинка или hello world на Arduino Mega2560, получаю следующие ошибки:

208
Реализация синглтона через unique_ptr

Реализация синглтона через unique_ptr

Встретил несколько раз в проектном коде реализации синглтонов подобным образом:

215
Как убрать множество массивов в один массив, чтоб передать в функцию?

Как убрать множество массивов в один массив, чтоб передать в функцию?

Есть массивы, динамические двумерные, которые формируются в результате математических операцийМне надо несколько массивов объединить в один...

253