Từ 1 tới 3 trên tổng số 3 kết quả

Đề tài: Hàm hủy bị gọi nhiều lần và không theo thứ tự có qui luật nào cả?

  1. #1
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    513

    Mặc định Hàm hủy bị gọi nhiều lần và không theo thứ tự có qui luật nào cả?

    Mình có code sau
    C++ Code:
    1. #include <cstdio>
    2. #include <vector>
    3. using namespace std;
    4.  
    5. class Number
    6. {
    7. private:
    8.     int num;
    9. public:
    10.     Number(int n)
    11.         :num(n){
    12.         printf("Constructor %d\n", n); 
    13.             };
    14.     ~Number()
    15.     {
    16.         printf("Destructor %d\n", num);
    17.     }  
    18. };
    19. namespace MyVector
    20. {
    21.     //vector<char*> strs;
    22.     vector<Number> numbers;
    23.     void vectorManipulate()
    24.     {
    25.         int l = 9;
    26.         int nums[9] = {2, 3, 5, 7,11, 13, 17,19, 23};
    27.         for (int i = 0; i < l; i++) {
    28.             numbers.emplace(numbers.end(), nums[i]);
    29.         }
    30.         //vector<Number>::iterator it;
    31.         //it = numbers.begin()+1;
    32.         //numbers.clear();
    33.         //numbers.erase(it);
    34.         printf("size %d\n", numbers.size());
    35.     }
    36. }
    37.  
    38. int main(int argc, char *argv[])
    39. {
    40.     MyVector::vectorManipulate();
    41. }
    42. /*kết quả là
    43.  
    44. Constructor 2
    45. Constructor 3
    46. Destructor 2
    47. Constructor 5
    48. Destructor 3
    49. Destructor 2
    50. Constructor 7
    51. Constructor 11
    52. Destructor 7
    53. Destructor 5
    54. Destructor 3
    55. Destructor 2
    56. Constructor 13
    57. Constructor 17
    58. Constructor 19
    59. Constructor 23
    60. Destructor 19
    61. Destructor 17
    62. Destructor 13
    63. Destructor 11
    64. Destructor 7
    65. Destructor 5
    66. Destructor 3
    67. Destructor 2
    68. size 9
    69. Destructor 23
    70. Destructor 19
    71. Destructor 17
    72. Destructor 13
    73. Destructor 11
    74. Destructor 7
    75. Destructor 5
    76. Destructor 3
    77. Destructor 2
    78.  
    79. [Program finished]
    80. */
    Theo kết quả thì constructor được gọi 1 lần mỗi đối tượng đúng thứ tự xen kẽ với lời gọi destructor nhiều lần không theo qui luật, sau khi xuất "size 9", destructor lại được gọi lại 1 lần cho mỗi đối tượng theo thứ tự ngược với constructor?
    Có ai giải thích được không, chỗ destructor trước "size 9" ấy?
    Mình dùng trình biên dịch Cxx droid

    - - - Nội dung đã được cập nhật ngày 01-07-2020 lúc 08:39 PM - - -

    Mình nghĩ điều đó có liên quan đến vector sẽ được cấp phát lại vùng nhớ khác khi thêm phần tử, nhưng sao constructor chỉ được gọi 1 lần???

    - - - Nội dung đã được cập nhật ngày 01-07-2020 lúc 08:47 PM - - -

    Mình thêm "numbers.reserve(9) vào trước "for" (dòng 27), kết quả đẹp như mơ
    Code:
    Constructor 2
    Constructor 3
    Constructor 5
    Constructor 7
    Constructor 11
    Constructor 13
    Constructor 17
    Constructor 19
    Constructor 23
    size 9
    Destructor 23
    Destructor 19
    Destructor 17
    Destructor 13
    Destructor 11
    Destructor 7
    Destructor 5
    Destructor 3
    Destructor 2
    
    [Program finished]
    - - - Nội dung đã được cập nhật ngày 01-07-2020 lúc 08:55 PM - - -

    Bỏ comment dòng 32 "numbers.clear()"
    Kết quả cũng đẹp như mơ
    Code:
    Constructor 2
    Constructor 3
    Constructor 5
    Constructor 7
    Constructor 11
    Constructor 13
    Constructor 17
    Constructor 19
    Constructor 23
    Destructor 23
    Destructor 19
    Destructor 17
    Destructor 13
    Destructor 11
    Destructor 7
    Destructor 5
    Destructor 3
    Destructor 2
    size 0
    
    [Program finished]
    Đã được chỉnh sửa lần cuối bởi khoaph : 01-07-2020 lúc 08:12 PM.

  2. #2
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    933

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    Mình nghĩ điều đó có liên quan đến vector sẽ được cấp phát lại vùng nhớ khác khi thêm phần tử, nhưng sao constructor chỉ được gọi 1 lần???
    Bạn nghĩ đúng ở vế đầu, vector sẽ được cấp phát lại khi thêm phần tử mới mà vùng nhớ của vector không đủ chỗ.

    Tại sao constructor chỉ được gọi 1 lần mà lại Destructor nhiều lần ?
    Thực ra, mỗi lần vector được cấp phát lại để chứa đủ các phần tử, nó sẽ Constructor Copy đối tượng mới, xong xóa đối tượng cũ. Tồng số lần Constructor - Destructor vẫn bằng nhau.
    Bạn thêm đoạn mã sau rồi thực thi sẽ hiểu rõ hơn
    C++ Code:
    1.     Number(const Number & Num)  // Phương thức khởi tạo Copy
    2.     {
    3.         num = Num.num;
    4.         printf("Constructor Copy from %d\n", num);
    5.     }

  3. #3
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    513

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    Bạn nghĩ đúng ở vế đầu, vector sẽ được cấp phát lại khi thêm phần tử mới mà vùng nhớ của vector không đủ chỗ.

    Tại sao constructor chỉ được gọi 1 lần mà lại Destructor nhiều lần ?
    Thực ra, mỗi lần vector được cấp phát lại để chứa đủ các phần tử, nó sẽ Constructor Copy đối tượng mới, xong xóa đối tượng cũ. Tồng số lần Constructor - Destructor vẫn bằng nhau.
    Bạn thêm đoạn mã sau rồi thực thi sẽ hiểu rõ hơn
    C++ Code:
    1.     Number(const Number & Num)  // Phương thức khởi tạo Copy
    2.     {
    3.         num = Num.num;
    4.         printf("Constructor Copy from %d\n", num);
    5.     }
    Mình thử code rồi, đúng như bạn nói.
    Cảm ơn bạn nhiều!

Tags của đề tài này

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