2008年5月1日星期四

编程常犯的错误

自己写程序也写了不短的日子了。这个blog就列出来自己遇到的常犯的错误吧。也算是给自己一个记录,一个提醒。 

        集合中的元素的删除。 

                for(int i=0; i < container.length; i++){ 

                        if(....){ 

                                   container.delete(i); 

                       } 

              } 

            在循环中可能删除多个复合条件的元素。这样的写法就错了。可以改写成 

                for(int i=container.length; i > 0; i--){ 

                        if(....){ 

                                   container.delete(i--); 

                       } 

              }            



             此外就是使用iterator在遍历的时候,直接用容器的delete或者remove方法删除iterator,然后没有跳出循环,继续遍历的话,也是错误的。在java中,可以使用iterator本身的remove。而c++的stl中没有对应的处理办法。如果不使用iterator的remove方法或者不能使用,那么循环中可以考虑如下的写法 

      for(Iterator iter = container.begin(); iter != container.end(); ){ 

             if(...){ 

                   Iterator tmpIter = iter; 

                    tmpIter++; 

                    container.remove(iter); 

                   iter = tmpIter; 

            } 

          else{ 

                iter++; 

         } 

      } 

         C/C++ 中分配内存 

         void AllocSpace(char *p){ 

                p = new char[1024]; 

         } 

        p只是一个局部变量,这样的分配只是导致内存泄露。 

        完成这个意图的写法可以有两种 

        char * AllocSpace(){ 

                return new char[1024]; 

        } 

      或者 

      void AllocSpace(char **p){ 

               *p = new char[1024]; 

        } 

      

    对于delete的误解 

                char *p = new char[1024]; 

               delete p; 

              if(NULL != p){ 

             } 

           delete(free) 只是释放指针指向的内存,并不会使得指针本身的值为NULL 

没有评论:

发表评论