Announcement

Collapse
No announcement yet.

Giải phóng con trỏ trong hàm??

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C++] Giải phóng con trỏ trong hàm??

    Các bạn góp ý hộ mình. Con trỏ retval trong hàm concat này mình ko delete, liệu có hại gì ko?
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <stdarg.h>
    #include <string.h>
    char* concat (const char *str, ...)
    {
        va_list arg;
        char *retval, *p;
        int len = 0;
    
        if (str == NULL)
            return NULL;
    
        len = strlen (str);
        va_start (arg, str);
    
        while ((p=va_arg(arg,char *))!=NULL)
            len += strlen (p);
    
        va_end(arg);
    
        retval = new char [len + 1];
    
        if (retval == NULL)
            return NULL;
    
        (void)strcpy(retval, str);
        va_start(arg, str);
    
        while ((p=va_arg(arg,char *)) != NULL)
            (void)strcat(retval, p);
    
        va_end (arg);
        return retval;
    }
    main()
    {
        printf("%s", concat("Ly ", "Tieu ", "Long ", "269", NULL));
        getch();
    }

  • #2
    new mà không có delete thì không tốt
    Chưa....

    Comment


    • #3
      Nếu không giải phóng trong hàm mà return kết về làm kết quả thì sau khi sử dụng kết quả hàm trả về phải delete đi ngay.

      Nếu không em thử đặt lời gọi hàm đó trong một vòng lặp vô tận và quan sát số RAM chương trình chiếm dụng nó tăng phi mã cỡ nào thì sẽ hiểu thôi. Lưu ý là nếu làm không khéo thì thử nghiệm này có thể khiến máy bị treo.

      Comment


      • #4
        Hình như sau khi delete retval xong thì ngay lập tức retval bị chương trình nào đó chiếm dụng thì phải, nên cuối cùng sau khi delete thì "return retval;" không còn ý nghĩa gì nữa!
        DELETE RETVAL TRONG HÀM
        Code:
        #include <stdio.h>
        #include <conio.h>
        #include <stdarg.h>
        #include <string.h>
        char* concat (const char *str, ...)
        {
            va_list arg;
            char *retval, *p;
            int len = 0;
        
            if (str == NULL)
                return NULL;
        
            len = strlen (str);
            va_start (arg, str);
        
            while ((p=va_arg(arg,char *))!=NULL)
                len += strlen (p);
        
            va_end(arg);
        
            retval = new char [len + 1];
        
            if (retval == NULL)
                return NULL;
        
            (void)strcpy(retval, str);
            va_start(arg, str);
        
            while ((p=va_arg(arg,char *)) != NULL)
                (void)strcat(retval, p);
            va_end (arg);
            delete retval;  
            return retval;  //GIÁ TRỊ RETVAL ĐÃ BỊ CHIẾM DỤNG
        }
        main()
        {
            printf("%s", concat("Ly ", "Tieu ", "Long ", "269", NULL));
            getch();
        }
        Cuối cùng thì mình delete bằng bí danh của nó. Nhưng nghĩ đi nghĩ lại thì ko biết mục đích có đạt được hay ko? Các bạn góp ý hộ mình đoạn code này nhé!
        DELETE RETVAL NGOÀI HÀM
        Code:
        #include <stdio.h>
        #include <conio.h>
        #include <stdarg.h>
        #include <string.h>
        char* concat (char*& retval, const char *str, ...) 
        {
            va_list arg;
            char *p;
            int len = 0;
        
            if (str == NULL)
                return NULL;
        
            len = strlen (str);
            va_start (arg, str);
        
            while ((p=va_arg(arg,char *))!=NULL)
                len += strlen (p);
        
            va_end(arg);
        
            retval = new char [len + 1];
        
            if (retval == NULL)
                return NULL;
        
            (void)strcpy(retval, str);
            va_start(arg, str);
        
            while ((p=va_arg(arg,char *)) != NULL)
                (void)strcat(retval, p);
        
            va_end (arg);
            return retval;
        }
        main()
        {
            char *pa;
            printf("%s", concat(pa, "Ly ", "Tieu ", "Long ", "269 ", NULL));
            delete pa; 
            getch();
        }
        Last edited by lytieulong_269; 27-12-2011, 18:48.

        Comment


        • #5
          Originally posted by lytieulong_269 View Post
          Các bạn góp ý hộ mình. Con trỏ retval trong hàm concat này mình ko delete, liệu có hại gì ko?
          Code:
          #include <stdio.h>
          #include <conio.h>
          #include <stdarg.h>
          #include <string.h>
          char* concat (const char *str, ...)
          {
              va_list arg;
              char *retval, *p;
              int len = 0;
          
              if (str == NULL)
                  return NULL;
          
              len = strlen (str);
              va_start (arg, str);
          
              while ((p=va_arg(arg,char *))!=NULL)
                  len += strlen (p);
          
              va_end(arg);
          
              retval = new char [len + 1];
          
              if (retval == NULL)
                  return NULL;
          
              (void)strcpy(retval, str);
              va_start(arg, str);
          
              while ((p=va_arg(arg,char *)) != NULL)
                  (void)strcat(retval, p);
          
              va_end (arg);
              return retval;
          }
          main()
          {
              printf("%s", concat("Ly ", "Tieu ", "Long ", "269", NULL));
              getch();
          }
          Code ham trên là OK ui.
          Chỉ có lúc xài thì bạn hơi sai trong cách xài thui:
          Code:
          int main()
          {
              char *s= concat("Ly ", "Tieu ", "Long ", "269", NULL);
              printf("%s",s);
              delete[] s;
              return 0;
          }

          Im a british accent lover

          Comment


          • #6
            Bạn xem hộ mình với 2 cách delete con trỏ trên #4 có vấn đề gì ko??

            Comment

            LHQC

            Collapse
            Working...
            X