2010-09-09 20 views
6

Tôi đã có một định nghĩa lớp tương tự như sau:Mặc định sao chép phân công với các thành viên mảng

class UUID 
{ 
    public: 
    // Using implicit copy assignment operator 

    private: 
    unsigned char buffer[16]; 
}; 

Tôi vừa có một bài kiểm tra đơn vị thất bại trên tôi rằng đã xác minh rằng phân công bản sao làm việc đúng cách. Trước sự ngạc nhiên của tôi, một byte ở giữa mảng đệm [] đã được sao chép không chính xác.

Sự hiểu biết của tôi là toán tử gán bản sao mặc định thực hiện sao chép thành viên và đối với thành viên mảng (không phải thành viên trỏ đến mảng) đòi hỏi bản sao phần tử của mảng. Tôi có nhầm không?

Cảm giác ruột của tôi ở đây là tôi bị cắn bởi một con trỏ lơ lửng ở đâu đó đã bị dồn vào giữa mảng của tôi. Nhưng, tôi thấy điều này lặp lại khi, ví dụ: Tôi sao chép một vector của các đối tượng này vào một vector khác.

Mọi người có thể cho tôi biết tôi đã đi sai ở đâu không?

Edit:

Để mở rộng về vấn đề này một chút, lớp không phải là một loại POD - nó xuất phát từ một vài lớp cơ sở trừu tượng và do đó có một destructor ảo. Tuy nhiên, mảng là thành viên dữ liệu duy nhất, và việc sử dụng đó đã phá vỡ trong các thử nghiệm đơn vị là thế này:

const int n = 100; 

std::vector<UUID> src, dst; 
src.reserve(n); 
dst.resize(n); 

for (int i = 0; i < n; ++i) { 
    UUID id; 
    src.push_back(id); 
} 

for (int i = 0; i < n; ++i) { 
    dst[i] = src[i]; 
} 

bool good = true; 
for (int i = 0; i < n; ++i) { 
    const bool thisGood = (dst[i] == src[i]); 

    std::cout << "i = " << i << " -> src = '" << src[i] 
      << "', dst = '" << dst[i] << "', src == dst ? " 
      << thisGood << '\n'; 

    good = (good && thisGood); 
} 
+0

Làm cách nào bạn tìm thấy "một byte ở giữa mảng đệm [] đã được sao chép không đúng." với trường hợp thử nghiệm được hiển thị? Có bất kỳ mục nhập cụ thể nào (trong số 100) đang bị hỏng không? – Chubsdad

+0

@Chubsdad: Lớp UUID có quá trình chèn dòng bị quá tải làm cho nội dung của mảng thành viên bị quá tải. Đối với trường hợp thử nghiệm này, tất cả 100 phần tử của vectơ đều có bộ đệm của chúng [9] byte bị hỏng, với cùng một giá trị. –

+0

Ok. Có thể hiển thị toán tử quá tải == không? – Chubsdad

Trả lời

9

hiểu biết của tôi được rằng toán tử gán sao chép mặc định độ hoạt động sao chép ngầm, và điều đó cho các thành viên mảng (không phải là thành viên trỏ tới mảng) yêu cầu sao chép phần tử của mảng.

Có. Chính xác.

Vấn đề của bạn không phải với toán tử gán bản sao (trừ khi bạn đã tìm thấy một số lỗi trình biên dịch bất thường, điều này khó xảy ra).

+0

Cảm ơn bạn đã xác nhận sự nghi ngờ của tôi . Thời gian cho một số phép thuật gỡ rối, tôi nghĩ ... –

+0

@Drew: Chúc may mắn! :-) –

+0

Cảm ơn! Tôi nghĩ tôi sẽ cần nó. BTW, tôi đã thêm một số mã văn bản/mã kiểm tra bổ sung trong bản chỉnh sửa. Tôi không nghĩ rằng nó thay đổi bất cứ điều gì, nhưng nghĩ rằng tôi muốn mang lại cho nó sự chú ý của bạn anyway. –

Các vấn đề liên quan