Tôi đang cố gắng thực hiện một mẫu bài tập C++ PL4 của Stroustrup. Nhiệm vụ là:không ném ngoại lệ bad_alloc
Phân bổ quá nhiều bộ nhớ bằng cách sử dụng
new
màbad_alloc
được ném. Báo cáo cách nhiều bộ nhớ được phân bổ và thời gian cần thiết. Thực hiện việc này hai lần: một lần không ghi vào bộ nhớ được cấp phát và sau khi viết thư cho từng thành phần .
Mã sau không ném một ngoại lệ std::bad_alloc
. Sau khi tôi thực hiện chương trình, tôi nhận được thông báo "Bị giết" trong thiết bị đầu cuối.
Ngoài ra. Đoạn mã sau sẽ thoát sau ~ 4 giây. Nhưng khi tôi bỏ ghi chú thông báo sử dụng bộ nhớ
// ++i;
// std::cout << "Allocated " << i*80 << " MB so far\n";
Chương trình sẽ chạy trong vài phút. Sau một thời gian nó in ra rằng terabyte bộ nhớ đã được cấp phát nhưng tôi không thấy nhiều thay đổi trong ứng dụng Màn hình hệ thống. Tại sao vậy?
Tôi sử dụng ứng dụng Linux và Màn hình hệ thống để xem tập quán.
#include <iostream>
#include <vector>
#include <chrono>
void f()
{
std::vector<int*> vpi {};
int i {};
try{
for(;;){
int* pi = new int[10000];
vpi.push_back(pi);
// ++i;
// std::cout << "Allocated " << i*80 << " MB so far\n";
}
}
catch(std::bad_alloc){
std::cerr << "Memory exhausted\n";
}
}
int main() {
auto t0 = std::chrono::high_resolution_clock::now();
f();
auto t1 = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(t0-t1).count() << " ms\n";
}
Đầu ra sẽ mất * nhiều hơn * nhiều thời gian hơn so với phân bổ bộ nhớ đơn giản. Nếu nó chạy trong 2 phút, nó có thể là 1:56 cho đầu ra và vẫn còn 4 giây cho phân bổ. –
Đó là trực giác của tôi. Nhưng tại sao nó in lại, giả sử, terabyte bộ nhớ đã được phân bổ cho đến nay? – tomtom
có thể trùng lặp của [Một cách để xác định sử dụng bộ nhớ "thực" của quá trình, tức là RSS bẩn riêng tư?] (Http://stackoverflow.com/questions/118307/a-way-to-determine-a-processs-real- memory-usage-ie-private-dirty-rss) –