cuốn sách gpt4 ai đã làm

c++ - sẽ <>> Phân bổ làm thành viên lớp

In lại Tác giả: Walker 123 Thời gian cập nhật: 28-11-2023 00:52:51 25 4
mua khóa gpt4 Nike

Tôi có một lớp, hãy gọi nó là Builder. Nó có một thành viên riêng được khai báo là

vector< vector< Node >> bộ đệm; // Nút là một lớp dữ liệu thuần túy.

Trong hàm tạo của lớp Builder này, tôi thực hiện điều này:

bộ đệm = vector< vector< Nút >>(số lượng);

trong đó "số tiền" chỉ được biết khi chạy.

Trong vòng đời của lớp trình xây dựng, một số thao tác được gọi trên thành viên bộ đệm. Các hoạt động duy nhất tôi sử dụng là:

bộ đệm[i].push_back(Node());
bộ đệm[i].clear();

Mình chỉ bổ sung thêm nội dung thuật toán vào đây để tham khảo:

// Tinh chỉnh bộ đệm
// kiểm tra tất cả các cấp (từ dưới lên) và nhóm 8 nút ở cấp cao hơn
for(int d = maxdeep; d >= 0; d--){
if(buffers[d].size() == 8){ // nếu chúng ta có 8 nút
if(isBufferEmpty(buffers[d])){
buffers[d-1].push_back(Node()); // đẩy lùi NULL để biểu thị 8 nút trống
} khác {
buffers[d-1].push_back(groupNodes(octree, buffers[d])); // đẩy lùi nút cha
}
buffers[d].clear(); // xóa 8 nút ở cấp độ này
} khác {
break; // ngắt vòng lặp for: không cần thay đổi cấp độ nào
}
}

Khi một đối tượng của lớp Builder vượt quá phạm vi, nó sẽ bị hủy cùng với các thành viên lớp của nó. Khi tôi ở chế độ Gỡ lỗi VS2010, không có vấn đề gì. Trong chế độ Phát hành, tôi gặp lỗi sau: "Windows đã kích hoạt điểm dừng".

Vấn đề nằm ở phần này của đặc tả STL:vector, tại lệnh gọi _Destroy.

khoảng trống _Tidy()
{ // giải phóng toàn bộ dung lượng lưu trữ
if (this->_Myfirst != 0)
{ // thứ gì đó cần giải phóng, hủy và giải phóng nó
cái này->_Orphan_all();
_Hủy (cái này->_Myfirst, cái này->_Mylast);
cái này->_Alval.deallocate(cái này->_Myfirst,
cái này->_Myend - cái này->_Myfirst);
}
cái này->_Myfirst = 0;
cái này->_Mylast = 0;
cái này->_Myend = 0;
}

Nhìn vào trình gỡ lỗi, tôi có thể thấy _Mylast có giá trị không chính xác (0x0000000000000), điều này có thể khiến quá trình phân bổ không thành công. Cuối cùng khi tôi thử làm buffers.clear() tôi cũng nhận được kết quả tương tự. (buffer[i].clear() hoạt động tốt). Ngoài ra, chương trình của tôi hoạt động tốt khi tôi nhấp vào "Tiếp tục".

Tôi có một số kết quả sau khi chạy thuật toán của mình. Những gì bạn thấy là số phần tử trong một vectơ đơn và các địa chỉ được trỏ đến bởi bộ đệm[i].begin() và bộ đệm[i].end(). "Bộ đệm chính" đề cập đến giá trị thu được khi gọi buffers.begin() và buffers.end().

  Bộ đệm chính bắt đầu: 0000000002068050
Đầu đệm chính: 0000000002068130
bộ đệm[0] : 0 phần tử, 0000000002068160 - 0000000002068160
bộ đệm [1]: 0 phần tử, 0000000002070080 - 0000000002070080
bộ đệm[2] : 0 phần tử, 0000000002068E70 - 0000000002068E70
bộ đệm [3]: 0 phần tử, 0000000001F71810 - 0000000001F71810
bộ đệm[4] : 0 phần tử, 0000000002068BB0 - 0000000002068BB0
bộ đệm [5]: 0 phần tử, 00000000020688F0 - 00000000020688F0
bộ đệm [6]: 0 phần tử, 0000000002068370 - 0000000002068370

Bây giờ câu hỏi của tôi là, làm thế nào tôi có thể làm hỏng _Mylast? (Dù sao thì tôi cũng đã phá hủy đống)

Vấn đề này chỉ bắt đầu nảy sinh khi tôi chuyển một thuật toán mà trước đây chỉ là một hàm được xác định trong phạm vi toàn cục vào một lớp. Tôi nghi ngờ điều này có liên quan đến cách C++ xử lý vectơ với tư cách là thành viên của lớp.

Lớp trình tạo của tôi sẽ có thể thiết lập một số bộ đệm nhất định (nội dung vectơ) và bật và đẩy vào các bộ đệm này khi nút ở trạng thái sự kiện. Đây là những gì tôi muốn đạt được.

câu trả lời hay nhất

mặc dù d bằng 0, bạn cũng có thể viết bộ đệm [d-1]. Đó có thể là vấn đề của bạn? Các lỗi ngoài giới hạn đôi khi không được phát hiện cho đến sau này (ví dụ: khi vectơ được giải phóng).

Về c++ - Phân bổ <>> với tư cách là thành viên của lớp, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/13129120/

25 4 0
Walker 123
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress