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

Đề tài: Lỗi "has triggered a breakpoint" khi thực hiện chồng toán tử

  1. #1
    Ngày gia nhập
    05 2010
    Nơi ở
    Nha Trang, Khánh Hòa
    Bài viết
    103

    Exclamation Lỗi "has triggered a breakpoint" khi thực hiện chồng toán tử

    Sơ lược là như thế này: mình có một lớp MVector gồm 1 mảng thực _arr, 1 hàm GetPtr() trả về địa chỉ của mảng thực _arr đó và một hàm chồng toán tử gán vector. Code:
    C++ Code:
    1. class MVector
    2. {
    3. private:
    4.     float* _arr;
    5.     int _n;
    6. public:
    7.     MVector(int Length);
    8.     MVector(float* Arr);
    9.     MVector(float* Arr,int Length);
    10.     float* GetPtr();
    11.  
    12.     MVector operator=(MVector &rhs);
    13.  
    14.     ~MVector(void);
    15. };
    16. MVector::MVector(int Length)
    17. {
    18.     _n=Length;
    19.     _arr=(float*)calloc(_n,sizeof(float));
    20. }
    21. MVector::MVector(float* Arr)
    22. {
    23.     _n=sizeof(Arr)/sizeof(float);
    24.     _arr=(float*)calloc(_n,sizeof(float));
    25.     for (int i=0;i<_n;i++) _arr[i]=Arr[i];
    26. }
    27. MVector::MVector(float* Arr,int Length)
    28. {
    29.     _n=Length;
    30.     _arr=(float*)calloc(_n,sizeof(float));
    31.     for (int i=0;i<_n;i++) _arr[i]=Arr[i];
    32. }
    33. MVector::~MVector(void)
    34. {
    35.     free(_arr);
    36. }
    37. float* MVector::GetPtr()
    38. {
    39.     return _arr;
    40. }
    41. MVector MVector::operator=(MVector &rhs)
    42. {
    43.     float* tmp=rhs.GetPtr();
    44.     MVector z(tmp);
    45.     return z;//Dòng này nếu để nguyên khi chạy sẽ báo lỗi has triggered a breakpoint, thay bằng return MVector(tmp) thì không có vấn đề gì
    46. }
    Có ai giải thích cho mình tại sao được không ạ :((
    Ngày mai ra sao cũng chẳng biết nữa
    Mà có ra sao thì cũng chả sao

  2. #2
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Bạn chưa nạp chồng hàm "tạo sao chép" (copy constructor). Khi bạn pass by value-return thì hàm tạo sao chép sẽ được gọi để tạo bản sao của đối tượng được trả về. Hàm tạo sao chép mặc định (default copy constructor) sẽ gán tất cả phần tử của đối tượng trả về cho đối tượng mới. Do đó, khi pass by value-return bạn sẽ có đối tượng mới có con trỏ _arr trỏ vào vùng dữ liệu mà con trỏ _arr của đối tượng "z" trong hàm (operator=) trỏ đến. Khi kết thúc hàm thì đối tượng "z" bị hủy, dữ liệu mà nó trỏ tới cũng bị giải phóng. Nhưng lúc này, đối tượng mới được tạo khi return, con trỏ _arr của nó vẫn trỏ vào vùng nhớ đã bị "z" giải phóng. Và khi đối tượng mới này bị hủy, nó cũng giải phóng vùng nhớ do con trỏ _arr trỏ đến. Vậy vùng nhớ đó đã bị giải phóng 2 lần.

    Nói tóm lại, bạn chỉ cần code thêm hàm "tạo sao chép" (copy constructor) nữa là xong.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

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

  1. nghĩa của 3 từ "principals", "artifacts", "securables" là như thế nào?
    Gửi bởi ntbao trong diễn đàn English for IT | Tiếng anh cho dân CNTT
    Trả lời: 2
    Bài viết cuối: 02-09-2017, 06:36 PM
  2. Lập trình C++ Lỗi app.exe has triggered a breakpoint
    Gửi bởi huudat271 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 08-11-2012, 09:14 AM
  3. Trả lời: 1
    Bài viết cuối: 01-12-2011, 07:32 PM
  4. Problems : " recover tree " with input as " preorder" and "inorder"
    Gửi bởi HoangManhHa1991 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 16
    Bài viết cuối: 13-04-2011, 10:19 PM
  5. Lỗi Triggered a breakpoint Trong MFC khi thoát chưong trình
    Gửi bởi haian trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 28-02-2011, 12:27 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