Tôi đang gặp vấn đề lạ tôi đã có thể theo dõi phần nào nhưng tôi vẫn không thể thấy nguyên nhân. Có lẽ ai đó ở đây có thể làm sáng tỏ một chút?Độ phân bổ bộ nhớ cấp chủ đề trên nền tảng được nhúng
Tôi đang chạy trên bộ xử lý PowerPC trên đầu VxWorks 5.5 đang phát triển trong C++ bằng chuỗi công cụ PPCgnu604.
Tôi có một lớp học như vậy:
class MyClass
{
public:
void run(void);
private:
CommandMesssageClass command;
StatusMessageClass status;
};
Khi ứng dụng của tôi được bắt đầu, nó sẽ tự động phân bổ một thể hiện của MyClass và đẻ trứng một sợi chỉ vào chức năng "chạy" của nó. Về cơ bản nó chỉ ngồi đó bỏ phiếu cho các lệnh và, sau khi nhận được, sẽ phát hành lại trạng thái.
Lưu ý rằng đây là phiên bản rút gọn của lớp học. Có một số phương pháp khác và các biến còn lại cho ngắn gọn. Vấn đề tôi thấy là khi cả hai lệnh và thông điệp trạng thái được định nghĩa là thành viên lớp riêng tư, tôi sẽ nhận được một sự thay đổi trong các byte có sẵn trong bộ nhớ mặc dù thực tế không nên có phân bổ bộ nhớ động. Điều này là quan trọng bởi vì điều này là làm tròn trong những gì cần phải là một thủ tục xác định và an toàn tốc độ.
Nếu tôi di chuyển một hoặc cả hai khai báo thư vào hàm chạy, nó hoạt động tốt mà không có phân bổ bổ sung!
Tôi phải thiếu một số điều cơ bản trong sự hiểu biết về khai báo C++ và cấp phát bộ nhớ. Sự hiểu biết của tôi là một cá thể lớp mà tôi tự động instansiate sẽ được phân bổ đầy đủ trên heap (bao gồm tất cả các biến thành viên) khi nó được tạo ra. Sự khác biệt mà tôi thấy ở đây sẽ là việc di chuyển các khai báo thông báo đến hàm chạy sẽ đặt chúng vào ngăn xếp thay thế. Heap trong trường hợp này là quá đủ lớn để đi kèm với toàn bộ kích thước của lớp. Tại sao nó dường như không được phân bổ đủ bộ nhớ cho đến khi các phần cụ thể được sử dụng?
Lớp thông báo không phân bổ động của riêng chúng. (Và nếu họ đã làm, tôi sẽ mong đợi di chuyển tuyên bố sẽ không thay đổi hành vi trong trường hợp này và tôi vẫn sẽ thấy một sự thay đổi trong kích thước của đống.)
Để giám sát việc cấp phát bộ nhớ Tôi đang sử dụng như sau VxWorks memLib (hoặc memPartLib) gọi:
memPartInfoGet(memSysPartId, &partitionStatus);
...
bytesFree = partitionStatus.numBytesFree;
Edit:
Để làm rõ, đối tượng MyClass được instansiated và khởi tạo trong một thói quen khởi và sau đó mã đi vào chế biến tỷ lệ an toàn. Trong thời gian này, khi nhận được một thông báo lệnh qua một dòng nối tiếp (tương tác đầu tiên với các đối tượng thông báo Lệnh hoặc Trạng thái), bộ nhớ bổ sung được cấp phát (hoặc thay vì số byte tự do giảm). Điều này là xấu bởi vì phân bổ bộ nhớ động không phải là xác định.
Tôi đã có thể loại bỏ vấn đề bằng cách di chuyển các biến lớp như tôi đã mô tả.
Không rõ ràng vấn đề của bạn là gì, bạn có sử dụng nhiều bộ nhớ phân bổ các thứ như thành viên lớp vs trên ngăn xếp hay bộ nhớ được sử dụng thay đổi theo thời gian trong một trong các trường hợp? – nos
Sizeof (MyClass) có thay đổi khi bạn nâng các thành viên lên khu vực công cộng không? Và phân bổ bộ nhớ thay đổi bao nhiêu? –
* Khi nào thay đổi phân bổ? Các đối tượng lớp nhỏ hơn có thời gian dễ dàng hơn trong một khối miễn phí trên heap. –