Эх сурвалжийг харах

Memory leak fixes (#1125)

* Memory leak caused by setting reference NULL instead of deallocating

* Memory leak fix for #1122

* Memory leak fix for #1124

* Memory leak fix for #1123

Instead of deleting, using a unique pointer like the other function that allocates Wraw.

* Memory leak fix for #1121

* Function call fixed

* Use get() Wraw's unique pointer to access pointer for fread()

* Removed unnecessary allocations

* Revert change to boolean array, size is only known at runtime

* Removed callocs for bool arrays, use vector instead

* Init vector with constructor to set default value
Robert Gützkow 6 жил өмнө
parent
commit
c9d0b35b6a

+ 1 - 0
include/igl/copyleft/opengl2/render_to_tga.cpp

@@ -72,6 +72,7 @@ IGL_INLINE bool igl::opengl::render_to_tga(
     if(NULL==imgFile)
     if(NULL==imgFile)
     {
     {
       printf("IOError: %s could not be opened...\n",tga_file.c_str());
       printf("IOError: %s could not be opened...\n",tga_file.c_str());
+      free(genericImage);
       return false;
       return false;
     }
     }
   }
   }

+ 1 - 0
include/igl/copyleft/opengl2/tga.cpp

@@ -373,6 +373,7 @@ igl::opengl::gliReadTGA(FILE *fp, char *name, int /*hflip*/, int vflip)
       sprintf(error, "TGA: error reading colormap (ftell == %ld)\n",
       sprintf(error, "TGA: error reading colormap (ftell == %ld)\n",
         ftell (fp));
         ftell (fp));
       if (_verbose) printf("%s\n", error);
       if (_verbose) printf("%s\n", error);
+      free(cmap);
       return NULL;
       return NULL;
     }
     }
 
 

+ 14 - 19
include/igl/principal_curvature.cpp

@@ -448,7 +448,7 @@ IGL_INLINE void CurvatureCalculator::getKRing(const int start, const double r, s
   int bufsize=vertices.rows();
   int bufsize=vertices.rows();
   vv.reserve(bufsize);
   vv.reserve(bufsize);
   std::list<std::pair<int,int> > queue;
   std::list<std::pair<int,int> > queue;
-  bool* visited = (bool*)calloc(bufsize,sizeof(bool));
+  std::vector<bool> visited(bufsize, false);
   queue.push_back(std::pair<int,int>(start,0));
   queue.push_back(std::pair<int,int>(start,0));
   visited[start]=true;
   visited[start]=true;
   while (!queue.empty())
   while (!queue.empty())
@@ -470,8 +470,6 @@ IGL_INLINE void CurvatureCalculator::getKRing(const int start, const double r, s
       }
       }
     }
     }
   }
   }
-  free(visited);
-  return;
 }
 }
 
 
 
 
@@ -479,16 +477,16 @@ IGL_INLINE void CurvatureCalculator::getSphere(const int start, const double r,
 {
 {
   int bufsize=vertices.rows();
   int bufsize=vertices.rows();
   vv.reserve(bufsize);
   vv.reserve(bufsize);
-  std::list<int>* queue= new std::list<int>();
-  bool* visited = (bool*)calloc(bufsize,sizeof(bool));
-  queue->push_back(start);
+  std::list<int> queue;
+  std::vector<bool> visited(bufsize, false);
+  queue.push_back(start);
   visited[start]=true;
   visited[start]=true;
   Eigen::Vector3d me=vertices.row(start);
   Eigen::Vector3d me=vertices.row(start);
-  std::priority_queue<std::pair<int, double>, std::vector<std::pair<int, double> >, comparer >* extra_candidates= new  std::priority_queue<std::pair<int, double>, std::vector<std::pair<int, double> >, comparer >();
-  while (!queue->empty())
+  std::priority_queue<std::pair<int, double>, std::vector<std::pair<int, double> >, comparer > extra_candidates;
+  while (!queue.empty())
   {
   {
-    int toVisit=queue->front();
-    queue->pop_front();
+    int toVisit=queue.front();
+    queue.pop_front();
     vv.push_back(toVisit);
     vv.push_back(toVisit);
     for (unsigned int i=0; i<vertex_to_vertices[toVisit].size(); ++i)
     for (unsigned int i=0; i<vertex_to_vertices[toVisit].size(); ++i)
     {
     {
@@ -498,17 +496,17 @@ IGL_INLINE void CurvatureCalculator::getSphere(const int start, const double r,
         Eigen::Vector3d neigh=vertices.row(neighbor);
         Eigen::Vector3d neigh=vertices.row(neighbor);
         double distance=(me-neigh).norm();
         double distance=(me-neigh).norm();
         if (distance<r)
         if (distance<r)
-          queue->push_back(neighbor);
+          queue.push_back(neighbor);
         else if ((int)vv.size()<min)
         else if ((int)vv.size()<min)
-          extra_candidates->push(std::pair<int,double>(neighbor,distance));
+          extra_candidates.push(std::pair<int,double>(neighbor,distance));
         visited[neighbor]=true;
         visited[neighbor]=true;
       }
       }
     }
     }
   }
   }
-  while (!extra_candidates->empty() && (int)vv.size()<min)
+  while (!extra_candidates.empty() && (int)vv.size()<min)
   {
   {
-    std::pair<int, double> cand=extra_candidates->top();
-    extra_candidates->pop();
+    std::pair<int, double> cand=extra_candidates.top();
+    extra_candidates.pop();
     vv.push_back(cand.first);
     vv.push_back(cand.first);
     for (unsigned int i=0; i<vertex_to_vertices[cand.first].size(); ++i)
     for (unsigned int i=0; i<vertex_to_vertices[cand.first].size(); ++i)
     {
     {
@@ -517,14 +515,11 @@ IGL_INLINE void CurvatureCalculator::getSphere(const int start, const double r,
       {
       {
         Eigen::Vector3d neigh=vertices.row(neighbor);
         Eigen::Vector3d neigh=vertices.row(neighbor);
         double distance=(me-neigh).norm();
         double distance=(me-neigh).norm();
-        extra_candidates->push(std::pair<int,double>(neighbor,distance));
+        extra_candidates.push(std::pair<int,double>(neighbor,distance));
         visited[neighbor]=true;
         visited[neighbor]=true;
       }
       }
     }
     }
   }
   }
-  free(extra_candidates);
-  free(queue);
-  free(visited);
 }
 }
 
 
 IGL_INLINE Eigen::Vector3d CurvatureCalculator::project(const Eigen::Vector3d& v, const Eigen::Vector3d& vp, const Eigen::Vector3d& ppn)
 IGL_INLINE Eigen::Vector3d CurvatureCalculator::project(const Eigen::Vector3d& v, const Eigen::Vector3d& vp, const Eigen::Vector3d& ppn)

+ 2 - 2
include/igl/readDMAT.cpp

@@ -195,8 +195,8 @@ IGL_INLINE bool igl::readDMAT(
     assert(W.size() == 0);
     assert(W.size() == 0);
     // Resize for output
     // Resize for output
     W.resize(num_rows,typename std::vector<Scalar>(num_cols));
     W.resize(num_rows,typename std::vector<Scalar>(num_cols));
-    double * Wraw = new double[num_rows*num_cols];
-    fread(Wraw, sizeof(double), num_cols*num_rows, fp);
+    std::unique_ptr<double[]> Wraw(new double[num_rows*num_cols]);
+    fread(Wraw.get(), sizeof(double), num_cols*num_rows, fp);
     // Loop over columns slowly
     // Loop over columns slowly
     for(int j = 0;j < num_cols;j++)
     for(int j = 0;j < num_cols;j++)
     {
     {

+ 14 - 2
include/igl/readMSH.cpp

@@ -328,7 +328,13 @@ IGL_INLINE bool igl::readMSH(
     for (size_t i=0; i<num_int_tags; i++)
     for (size_t i=0; i<num_int_tags; i++)
         fin >> int_tags[i];
         fin >> int_tags[i];
 
 
-    if (num_string_tags <= 0 || num_int_tags <= 2) { assert(false && "invalid format"); return; }
+    if (num_string_tags <= 0 || num_int_tags <= 2) {
+        delete[] str_tags;
+        delete[] real_tags;
+        delete[] int_tags;
+        assert(false && "invalid format");
+        return;
+    }
     std::string fieldname = str_tags[0];
     std::string fieldname = str_tags[0];
     int num_components = int_tags[1];
     int num_components = int_tags[1];
     int num_entries = int_tags[2];
     int num_entries = int_tags[2];
@@ -397,7 +403,13 @@ IGL_INLINE bool igl::readMSH(
     for (size_t i=0; i<num_int_tags; i++)
     for (size_t i=0; i<num_int_tags; i++)
         fin >> int_tags[i];
         fin >> int_tags[i];
 
 
-    if (num_string_tags <= 0 || num_int_tags <= 2) { assert(false && "invalid format"); return; }
+    if (num_string_tags <= 0 || num_int_tags <= 2) {
+        delete[] str_tags;
+        delete[] real_tags;
+        delete[] int_tags;
+        assert(false && "invalid format");
+        return;
+    }
     std::string fieldname = str_tags[0];
     std::string fieldname = str_tags[0];
     int num_components = int_tags[1];
     int num_components = int_tags[1];
     int num_entries = int_tags[2];
     int num_entries = int_tags[2];

+ 1 - 1
include/igl/xml/serialize_xml.cpp

@@ -124,7 +124,7 @@ namespace igl
       {
       {
         std::cerr << "File not found!" << std::endl;
         std::cerr << "File not found!" << std::endl;
         doc->PrintError();
         doc->PrintError();
-        doc = NULL;
+        delete doc;
       }
       }
       else
       else
       {
       {