Đối với những mới trong C++/GCC/Linux (32bit) ...
Nó được một lúc, và nó thực hiện phụ thuộc, nhưng tôi tin rằng mới sẽ, đằng sau hậu trường, gọi malloc(). Malloc(), trừ khi bạn yêu cầu điều gì đó vượt quá không gian địa chỉ của quy trình hoặc bên ngoài giới hạn được chỉ định (ulimit/getrusage), sẽ không thành công. Ngay cả khi hệ thống của bạn không có đủ RAM + SWAP. Ví dụ: malloc (1gig) trên một hệ thống với 256Meg RAM + 0 SWAP sẽ, tôi tin rằng, thành công.
Tuy nhiên, khi bạn sử dụng bộ nhớ đó, hạt nhân cung cấp các trang thông qua cơ chế cấp phát lười biếng. Tại thời điểm đó, khi bạn lần đầu tiên đọc hoặc ghi vào bộ nhớ đó, nếu hạt nhân không thể cấp phát các trang bộ nhớ cho quá trình của bạn, nó sẽ giết chết quá trình của bạn.
Đây có thể là sự cố trên máy tính dùng chung, khi đồng nghiệp của bạn bị rò rỉ lõi chậm. Đặc biệt là khi ông bắt đầu gõ ra các quy trình hệ thống.
Vì vậy, thực tế là bạn đang thấy std :: bad_alloc ngoại lệ là "thú vị".
Bây giờ new sẽ chạy hàm tạo trên bộ nhớ được cấp phát, chạm vào tất cả các trang bộ nhớ đó trước khi trả về. Tùy thuộc vào việc triển khai, nó có thể đang bẫy tín hiệu ngoài bộ nhớ.
Bạn đã thử điều này với đồng bằng o'l malloc?
Bạn đã thử chạy chương trình "miễn phí" chưa? Bạn có đủ bộ nhớ không?
Như những người khác đã đề xuất, bạn đã kiểm tra giới hạn/ulimit/getrusage() cho khó khăn & ràng buộc mềm?
Mã của bạn trông như thế nào, chính xác? Tôi đang đoán ClassFoo mới [N]. Hoặc có lẽ char mới [N].
Kích thước là gì (ClassFoo)? N là gì?
Phân bổ 64 * 288000 (17.58Meg) không đáng kể đối với hầu hết các máy hiện đại ... Bạn có đang chạy trên một hệ thống nhúng hay thứ gì đó đặc biệt khác không?
Ngoài ra, bạn có đang liên kết với một đơn vị phân bổ mới tùy chỉnh mới không? Lớp học của bạn có đơn vị phân bổ mới mới không?
Cấu trúc dữ liệu (lớp) của bạn có phân bổ các đối tượng khác như một phần của hàm tạo của nó không?
Có ai đó đã giả mạo thư viện của bạn không? Bạn đã cài đặt nhiều trình biên dịch chưa? Bạn đang sử dụng sai đường dẫn bao gồm hoặc thư viện?
Bạn có đang liên kết với các tệp đối tượng cũ không? Bạn có cần phải biên dịch lại tất cả các tệp nguồn của mình không?
Bạn có thể tạo chương trình thử nghiệm tầm thường không? Chỉ là một vài dòng mã tái tạo lỗi? Hoặc là vấn đề của bạn ở nơi khác, và chỉ hiển thị ở đây?
-
Đối với những gì nó có giá trị, tôi đã được phân bổ trên các khối dữ liệu 2Gig với mới trong 32bit linux dưới g ++. Vấn đề của bạn nằm ở nơi khác.
Bạn có cần tất cả điều đó trong một lần không? Nếu không, bạn có thể sử dụng một bộ nhớ-pool và một phân bổ tùy chỉnh để quản lý hồ bơi. – dirkgently
Như tôi đã nói, tôi đang cố gắng giả định mã sản xuất sẽ làm gì. Tôi sẽ sử dụng một hồ bơi bộ nhớ phân bổ tĩnh nếu tôi có thể. – JeffV
Bạn có thể sử dụng một hồ bơi được phân bổ tĩnh và thay thế các cuộc gọi của bạn để xóa bằng chức năng 'FreeBlock'. Bằng cách này bạn có thể kiểm tra xem bạn đã điền vào tất cả các khối có được. –