fixed memory leak in Table class
authorVictor Kirhenshtein <victor@netxms.org>
Thu, 21 Jul 2016 12:47:26 +0000 (15:47 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Thu, 21 Jul 2016 12:47:26 +0000 (15:47 +0300)
include/nms_util.h
src/libnetxms/table.cpp
tests/test-libnetxms/test-libnetxms.cpp

index 1d12c07..daae81d 100644 (file)
@@ -978,7 +978,7 @@ public:
 
    const TCHAR *getValue() { return m_value; }
    void setValue(const TCHAR *value) { safe_free(m_value); m_value = _tcsdup_ex(value); }
-   void setPreallocatedValue(TCHAR *value) { safe_free(m_value); m_value = value; }
+   void setPreallocatedValue(TCHAR *value) { free(m_value); m_value = value; }
 
    int getStatus() { return m_status; }
    void setStatus(int status) { m_status = status; }
@@ -1008,7 +1008,7 @@ public:
    void setPreallocated(int index, TCHAR *value, int status, UINT32 objectId) { TableCell *c = m_cells->get(index); if (c != NULL) c->setPreallocated(value, status, objectId); }
 
    void setValue(int index, const TCHAR *value) { TableCell *c = m_cells->get(index); if (c != NULL) c->setValue(value); }
-   void setPreallocatedValue(int index, TCHAR *value) { TableCell *c = m_cells->get(index); if (c != NULL) c->setPreallocatedValue(value); }
+   void setPreallocatedValue(int index, TCHAR *value) { TableCell *c = m_cells->get(index); if (c != NULL) c->setPreallocatedValue(value); else free(value); }
 
    void setStatus(int index, int status) { TableCell *c = m_cells->get(index); if (c != NULL) c->setStatus(status); }
 
index 3214821..07f5639 100644 (file)
@@ -528,12 +528,16 @@ void Table::setAt(int nRow, int nCol, const TCHAR *pszData)
 /**
  * Set pre-allocated data at position
  */
-void Table::setPreallocatedAt(int nRow, int nCol, TCHAR *pszData)
+void Table::setPreallocatedAt(int nRow, int nCol, TCHAR *data)
 {
    TableRow *r = m_data->get(nRow);
    if (r != NULL)
    {
-      r->setPreallocatedValue(nCol, pszData);
+      r->setPreallocatedValue(nCol, data);
+   }
+   else
+   {
+      free(data);
    }
 }
 
index e86b9d8..a67a92c 100644 (file)
@@ -565,6 +565,37 @@ static void TestObjectArray()
    delete array;
 }
 
+/**
+ * Table tests
+ */
+static void TestTable()
+{
+   StartTest(_T("Table: create"));
+   Table *table = new Table();
+   AssertEquals(table->getNumRows(), 0);
+   EndTest();
+
+   StartTest(_T("Table: set on empty table"));
+   table->set(0, 1.0);
+   table->set(1, _T("test"));
+   table->setPreallocated(1, _tcsdup(_T("test")));
+   AssertEquals(table->getNumRows(), 0);
+   EndTest();
+
+   StartTest(_T("Table: add row"));
+   table->addRow();
+   AssertEquals(table->getNumRows(), 1);
+   AssertEquals(table->getNumColumns(), 0);
+   EndTest();
+
+   StartTest(_T("Table: set on empty row"));
+   table->set(0, _T("test"));
+   table->setPreallocated(1, _tcsdup(_T("test")));
+   AssertEquals(table->getNumRows(), 1);
+   AssertEquals(table->getNumColumns(), 0);
+   EndTest();
+}
+
 /**
  * main()
  */
@@ -586,5 +617,6 @@ int main(int argc, char *argv[])
    TestQueue();
    TestHashMap();
    TestObjectArray();
+   TestTable();
    return 0;
 }