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

Đề tài: Copy constructor, return class value, error!

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

    Mặc định Copy constructor, return class value, error!

    Mình có code sau
    C++ Code:
    1. #include <iostream>
    2. #include <vector>
    3. using namespace std;
    4.  
    5. class Vec : public vector<int>
    6. {
    7.     public:
    8.     Vec(Vec& vec)
    9.         : vector<int>(vec)
    10.     {}
    11.     Vec(int n)
    12.     {
    13.         this->push_back(n);
    14.     }
    15.     void print()
    16.     {
    17.         for (int i = 0, l = this->size(); i < l; i++) {
    18.             cout << " " << (*this)[i];
    19.         }
    20.         cout << "\n";
    21.     }
    22.     static Vec myVec()
    23.     {
    24.         //return *(new Vec(53));
    25.         return Vec(59);
    26.     }
    27. };
    28. int main(int argc, char *argv[])
    29. {
    30.     Vec vec(31);
    31.     vec.push_back(37);
    32.     vec.print();
    33.     Vec vec2(vec);
    34.     vec2.push_back(41);
    35.     vec2.print();
    36.     Vec::myVec().print();
    37. }
    38. /*code trên có lỗi sau, tbd cxxdroid
    39.  
    40. __bionic_open_tzdata_path: ANDROID_DATA not set!
    41. __bionic_open_tzdata_path: ANDROID_ROOT not set!
    42. __bionic_open_tzdata_path: ANDROID_DATA not set!
    43. __bionic_open_tzdata_path: ANDROID_ROOT not set!
    44. /storage/emulated/0/Documents/01-01-2022/hoi cdcv/ham-tao-tham-so-int-va-copy.cxx:25:10: error: no matching constructor for initialization of 'Vec'
    45.                 return Vec(59);
    46.                        ^~~~~~~
    47. /storage/emulated/0/Documents/01-01-2022/hoi cdcv/ham-tao-tham-so-int-va-copy.cxx:8:2: note: candidate constructor not viable: expects an l-value for 1st argument
    48.         Vec(Vec& vec)
    49.         ^
    50. /storage/emulated/0/Documents/01-01-2022/hoi cdcv/ham-tao-tham-so-int-va-copy.cxx:11:2: note: candidate constructor not viable: no known conversion from 'Vec' to 'int' for 1st argument
    51.         Vec(int n)
    52.         ^
    53. 1 error generated.
    54.  
    55. */
    Nếu comment dòng 25, bỏ comment dòng 24, thì chạy không lỗi, nhưng như vậy thì gây memory leak
    Có ai có thể giải thích nguyên do lỗi trên không? Mình chỉ biết nó sẽ gọi copy constructor chỗ return thôi

    - - - Nội dung đã được cập nhật ngày 29-04-2022 lúc 04:02 PM - - -

    Tìm ra rồi, thiếu const
    Vec(const Vec&)

  2. #2
    Ngày gia nhập
    07 2018
    Bài viết
    1

    Vẫn có thể xảy ra mem leak nếu xài class này đa hình như là vector<int>*, vì std::vector không có virtual dtor

    Đừng bao giờ kế thừa từ standard containers.

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

    Trích dẫn Nguyên bản được gửi bởi See Xem bài viết
    Vẫn có thể xảy ra mem leak nếu xài class này đa hình như là vector<int>*, vì std::vector không có virtual dtor

    Đừng bao giờ kế thừa từ standard containers.
    Cảm ơn bạn đã nhắc
    Mình đã từng nghe về điều này nhưng phớt lờ
    Mới vừa google về nó
    Nói thêm về nó để các thành viên khác đề phòng
    Thông thường khi kế thừa từ 1 lớp ta thường bổ sung các field mới, và cũng bình thường khi tạo cho lớp mới 1 hàm hủy có nhiệm vụ hủy các field của nó. Khi thực hiện đa hình, tức khai báo con trỏ lớp cơ sở trỏ đến lớp thừa kế, sau đó hủy con trỏ bằng lệnh delete. Khi này, nếu hàm hủy lớp cơ sở là virtual thì hàm hủy lớp thừa kế sẽ được gọi, mọi tài nguyên đề bị hủy. Nhưng nếu hàm hủy lớp cơ sở là không virtual, nó sẽ được gọi, các tài nguyên định nghĩa trong lớp cơ sở sẽ bị hủy. Nhưng hàm hủy của lớp thừa kế sẽ không bao giờ được gọi, kết quả là tài nguyên trong lớp thừa kế không bị hủy, và gây ra rò rĩ.
    Ps: trong trường hợp của mình không thực hiện đa hình nên không sao

  4. #4
    Ngày gia nhập
    06 2009
    Bài viết
    11

    vì bạn khai báo kiểu là Vec, std::vector không có virtual dtor, nên dtor của std::vector sẽ không được gọi, chỉ có của Vec (được generate tự động) là chạy thôi.

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