Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: gặp rắc rối với phương thức hủy bỏ (destructor)

  1. #1
    Ngày gia nhập
    01 2008
    Bài viết
    46

    Mặc định gặp rắc rối với phương thức hủy bỏ (destructor)

    C++ Code:
    1. #include<conio.h>
    2. #include<iostream.h>
    3. #include<stdio.h>
    4. #include<math.h>
    5.  
    6. class ARRAY
    7. {
    8.     float *v;
    9.     int n;
    10.     public:
    11.         ARRAY(int N=2)
    12.         {
    13.             n=N;
    14.             v=new float[n];
    15.             for(int i=0;i<n;++i)
    16.             {
    17.                 cout<<"v["<<i<<"]=";
    18.                 cin>>v[i];
    19.             }
    20.         }
    21.         ~ARRAY()
    22.         {      
    23.             cout<<"\nmemory is released...";
    24.             getch();
    25.             delete []v;
    26.         }
    27.         friend int Get(float *&V,ARRAY temp);
    28. };
    29. int Get(float *&V,ARRAY temp)
    30.     {
    31.         V=temp.v;
    32.         return temp.n;
    33.     };
    34.  
    35. class MERGE
    36. {
    37.     ARRAY u,v;
    38.     public:
    39.         MERGE(int N1,int N2)
    40.         {
    41.             ARRAY u(N1),v(N2);         
    42.         }
    43.         friend float Tong(MERGE temp);
    44. };
    45.  
    46. float Tong(MERGE temp)
    47. {
    48.     float t=0,*M,*N;
    49.     int N1=Get(M,temp.u);
    50.     int N2=Get(N,temp.v);
    51.  
    52.         for(int i=0;i<N1;++i)
    53.             t+=M[i];
    54.        
    55.         for(i=0;i<N2;++i)
    56.             t+=N[i];       
    57.        
    58.         return t;
    59. };
    60.  
    61. void main()
    62. {
    63.     MERGE a(3,4);
    64.         cout<<Tong(a);
    65.    
    66. }

    khi không có destructor thì chương trình chạy được
    nhưng khi có destructor thì chương trình chưa tính đã giải phóng bộ nhớ

    1 cái nữa là đề bài yêu cầu class MERGE có thành phần dữ liệu là 2 vector ARRAY u,v; nhưng lại yêu cầu phương thức thiết lập tạo 2 ARRAY u và v với giá trị N1 N2 thành phần.Mình ko biết làm sao cả vì chương trình toàn tính hàm Tong theo u và v mặc định có 2 thành phần.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    mù english+ngu thuật toán+lười--->làm sao trở thành kỹ sư phần mềm

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Có hay không có bỏ destructor code này cũng chết chắc !!!
    C++ Code:
    1. int Get(float *&V,ARRAY temp)
    2.     {
    3.         V=temp.v;
    4.         return temp.n;
    5.     };
    2 con trỏ trỏ vào 1 chỗ !! Và không hề có khởi tạo cho 2 con trỏ V ! Suy nghĩ kĩ lại xem

  3. #3
    Ngày gia nhập
    01 2008
    Bài viết
    46

    v thì có khởi tạo rùi mà
    C++ Code:
    1. ARRAY(int N=2)
    2.         {
    3.             n=N;
    4.             v=new float[n];
    5.             for(int i=0;i<n;++i)
    6.             {
    7.                 cout<<"v["<<i<<"]=";
    8.                 cin>>v[i];
    9.             }
    10.         }
    còn V thì mình phục vụ cho hàm float Tong(MERGE temp)
    hàm int Get (float *&V) : trả về giá trị của vector *v và số thành phần của v trong đối tượng gọi
    mù english+ngu thuật toán+lười--->làm sao trở thành kỹ sư phần mềm

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    C++ Code:
    1. int Get(float *&V,ARRAY temp)
    2.     {
    3.         V=temp.v;
    4.         return temp.n;
    5.     };
    Cậu gán cho con trỏ V = temp.v. Nó chỉ copy địa chỉ của nhau thôi, không có chuyện gán cả mãng như cậu mong muốn đâu.
    Ví dụ :
    Code:
    [  rác ]                                             [1][2][3]
       /                                                       /
    v ( address = 0x1 )            temp.v ( address = 0x2 )
    Khi v = temp.v thì
    v trỏ tới [1][2][3].
    Cậu bỏ destructor đi thì [1][2][3] vẫn còn tồn tại, có nó thì destructor sẽ được gọi sau khi hàm gets kết thúc, và kết quả là cậu không có gì hết. NHƯNG đây là design poor, cho nên tui sẽ không fix vì cách này là sai hoàn toàn, class MERGE của cậu không mang ý nghĩa nhiều lắm, tính tổng 2 mãng chỉ cần quá tải toán tử + là ok.
    Hơn nữa, code có con trỏ thì **bắt buộc** phải có copy constructor và toán tử gán. Định nghĩa thêm 2 thằng này vào.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

Các đề tài tương tự

  1. Kỹ thuật C++ Câu hỏi destructor
    Gửi bởi phongdt trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 14-11-2012, 09:06 AM
  2. Hỏi về destructor
    Gửi bởi optimist27 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 05-02-2010, 09:37 AM
  3. Constructor và Destructor của lớp cơ sở !?
    Gửi bởi howto trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 19-01-2009, 04:22 PM
  4. Hỏi về Destructor trong C++
    Gửi bởi .:Lee May Too:. trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 05-08-2008, 12:16 AM
  5. Hàm constructor và destructor
    Gửi bởi 1st | Kylin trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 03-06-2008, 01:56 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn