diff --git a/Changes b/Changes index 5eaa1ea8a..84526c0c1 100644 --- a/Changes +++ b/Changes @@ -19,6 +19,9 @@ The contributors that suggested a given feature are shown in []. Thanks! **** Fix compiler warning when WIDTH warning ignored on large compare. +**** Fix memory leak in VerilatedVcd dumps, bug1222 partial. [Shareef Jalloq] + + * Verilator 3.912 2017-09-23 diff --git a/include/verilated_vcd_c.cpp b/include/verilated_vcd_c.cpp index f7e115e52..1d8bdc3ac 100644 --- a/include/verilated_vcd_c.cpp +++ b/include/verilated_vcd_c.cpp @@ -67,6 +67,7 @@ protected: VerilatedVcdCallback_t changecb, void* ut, vluint32_t code) : m_initcb(icb), m_fullcb(fcb), m_changecb(changecb), m_userthis(ut), m_code(code) {}; + ~VerilatedVcdCallInfo() {} }; //============================================================================= @@ -228,6 +229,10 @@ VerilatedVcd::~VerilatedVcd() { if (m_sigs_oldvalp) { delete[] m_sigs_oldvalp; m_sigs_oldvalp=NULL; } deleteNameMap(); if (m_filep && m_fileNewed) { delete m_filep; m_filep = NULL; } + for (CallbackVec::iterator it=m_callbacks.begin(); it!=m_callbacks.end(); ++it) { + delete (*it); + } + m_callbacks.clear(); // Remove from list of traces VcdVec::iterator pos = find(singleton().s_vcdVecp.begin(), singleton().s_vcdVecp.end(), this); if (pos != singleton().s_vcdVecp.end()) { singleton().s_vcdVecp.erase(pos); } diff --git a/include/verilated_vcd_c.h b/include/verilated_vcd_c.h index 377a3e899..b353b5401 100644 --- a/include/verilated_vcd_c.h +++ b/include/verilated_vcd_c.h @@ -96,10 +96,12 @@ private: vluint64_t m_wrChunkSize; ///< Output buffer size vluint64_t m_wroteBytes; ///< Number of bytes written to this file - vluint32_t* m_sigs_oldvalp; ///< Pointer to old signal values - std::vector m_sigs; ///< Pointer to signal information - std::vector m_callbacks; ///< Routines to perform dumping - typedef std::map NameMap; + vluint32_t* m_sigs_oldvalp; ///< Pointer to old signal values + typedef std::vector SigVec; + SigVec m_sigs; ///< Pointer to signal information + typedef std::vector CallbackVec; + CallbackVec m_callbacks; ///< Routines to perform dumping + typedef std::map NameMap; NameMap* m_namemapp; ///< List of names for the header typedef std::vector VcdVec;