- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我读到过,由于堆栈展开,从析构函数中抛出不是一个好主意。我不确定我是否完全理解。所以我尝试了下面的例子
cấu trúc foo
{
~foo()
{
throw 1;
}
};
struct bar
{
~bar()
{
throw 2;
}
};
int chính()
{
thử
{
foo a;
bar b;
throw 3;
}catch(int a)
{
std::cout << a;
}
}
现在我期望 a 将是 1,因为首先抛出 3,然后调用 b 的析构函数,抛出 2,然后调用 a 的析构函数,抛出 1。显然情况并非如此,这可以解释为什么它从析构函数中抛出不是一个好主意。我的问题是为什么 abort() 被称为 b 的析构函数?
câu trả lời hay nhất
hiện hữu堆栈展开期间抛出异常这将导致调用std::chấm dứt
,其默认操作是调用std::abort
.
CERT在他们的 ERR33-CPP. Destructors must not throw exceptions 中有很好的解释文件说(强调我的):
A destructor is very likely to be called during stack unwinding resulting from an exception being thrown. If the destructor itself throws an exception, having been called as the result of an exception being thrown, then the function std::terminate() is called with the default effect of calling std::abort(). This could provide the opportunity for a denial-of-service attack. Hence, destructors must satisfy the no-throw guarantee, that is, they must not throw an exception if they themselves have been called as the result of an exception being thrown.
C++ 标准草案 15.2
构造函数和析构函数 中对此进行了介绍,其中指出:
The process of calling destructors for automatic objects constructed on the path from a try block to a throw-expression is called “stack unwinding.” If a destructor called during stack unwinding exits with an exception, std::terminate is called (15.5.1). [ Note: So destructors should generally catch exceptions and not let them propagate out of the destructor. —end note ]
请注意,在 C++11 中,析构函数被隐式指定 noexcept(true)
,只要它调用的函数都不允许异常。因此,在这种情况下,无论从析构函数中抛出什么,都会调用 std::chấm dứt
。
từ 12.4
kẻ hủy diệt部分:
A declaration of a destructor that does not have an exception-specification is implicitly considered to have the same exception-specification as an implicit declaration (15.4).
Và 15.4
说:
An implicitly declared special member function (Clause 12) shall have an exception-specification. If f is an implicitly declared default constructor, copy constructor, move constructor, destructor, copy assignment operator, or move assignment operator, its implicit exception-specification specifies the type-id T if and only if T is allowed by the exception-specification of a function directly invoked by f’s implicit definition; f shall allow all exceptions if any function it directly invokes allows all exceptions, and f shall allow no exceptions if every function it directly invokes allows no exceptions.
理论上你可以使用 std::uncaught_exception在析构函数中但在 GotW #47 中检测堆栈展开 Herb Sutter 解释了为什么这种技术不像看起来那么有用。
尽管 Herb 最近在 N4152: uncaught_exceptions 中提出了一个修复方案
关于c++ - 为什么不能从析构函数中抛出。例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26395476/
Có ai có thể cho tôi ví dụ về cách sử dụng hàm crypt_r() không? Từ trang man, không rõ liệu chuỗi char* được trả về trỏ đến một khối bộ nhớ được phân bổ bên trong chính hàm đó (trong heap) hay nó vẫn trỏ đến bộ nhớ tĩnh như crypt()? câu trả lời hay nhất
Trong bài báo Spectre, có một ví dụ khai thác quyền truy cập mảng ngoài giới hạn (phần 1.2). Mã là if (x < array1_size) y = array2[ array1[x] * 256 ];
Đây là câu hỏi tiếp theo cho Ngữ pháp: sự khác biệt giữa từ trên xuống và từ dưới lên? Tôi học được gì từ câu hỏi này: Bản thân ngữ pháp không phải từ trên xuống hay từ dưới lên, nhưng trình phân tích cú pháp có một số
Việc khai báo các biến trong hàm tạo java có hợp pháp không? Ví dụ. Time(){ long timeMill = System.currentTimeMillis();
Tôi đã nghiên cứu kỹ các ví dụ về lưới trơn và muốn liên hệ với cộng đồng SO và yêu cầu một ví dụ về bản trình diễn chỉnh sửa bảng tính Excel? Về mặt lưu trữ, lưới sẽ chỉ lưu trữ dữ liệu số nguyên và lưới sẽ được lưu trữ bên trong trang dao cạo mvc3
Tôi đang gặp khó khăn khi đặt một menu ngu ngốc vào giữa trang trên trang web của mình. Tôi biết tôi có thể đặt chiều rộng của div bên ngoài thành giá trị px, nhưng làm cách nào tôi có thể đặt nó ở giữa trên một trang web phản hồi? Đây là trang: http://103.4.17.225/~america/i
Tôi đang tìm kiếm một chủ đề để sử dụng trên wordpress. Đôi khi một trang sẽ tải chính xác trên trình duyệt web đã thay đổi kích thước nhưng không tải được trên thiết bị di động và mặc dù kích thước giống nhau nhưng nó sẽ tải không đúng cách nào đó (thường bị sai lệch). Ví dụ: trong trang này ( http://
hợp { unsigned char raw[8]; struct { uint8_t gz_method; uint8_t cờ;
Tôi muốn sử dụng hàm matchShapes() để tìm đối tượng trong hình ảnh truy vấn. Giả sử tôi có hình ảnh mô hình của một cuốn sách và tôi muốn trích xuất hình dạng của nó rồi cố gắng tìm cuốn sách (hình dạng của nó) trong một hình ảnh khác. Tôi đã tìm kiếm rất nhiều trên Google nhưng không thể tìm thấy bất cứ điều gì về cách
Tôi đang tìm một ví dụ đơn giản, ngắn gọn về đá quý bằng cách sử dụng inotify để phát hiện các thay đổi trong thư mục. Nó thiếu ví dụ. Có một ví dụ trong ví dụ về câu trả lời hay nhất/watcher.rb Liên kết trỏ đến re của aredridel.
Tôi đang cố gắng tìm hiểu đệ quy là gì trong lập trình và tôi cần ai đó xác nhận rằng tôi hoàn toàn hiểu nó là gì. Cách tôi đang cố nghĩ về nó là thông qua việc phát hiện va chạm giữa các vật thể. Giả sử chúng ta có một hàm. Hàm này được gọi khi xác định được xung đột và được gọi cùng với danh sách các đối tượng để xác định
Tôi đang cố gắng tìm hiểu cách sử dụng jBullet trong một dự án mà tôi đang thực hiện, tôi đã xem các bản demo do nguồn cung cấp nhưng tôi không thể hiểu các bản demo này hiển thị các đối tượng như thế nào. Có ai có tài nguyên tốt có thể chỉ cho tôi hoặc cung cấp ví dụ cơ bản về hiển thị một hoặc hai đối tượng trên màn hình không? hiện hữu
Tôi muốn vẽ các đường trên biểu đồ x, y đơn giản để hiển thị trong JApplet bằng JGraphT. Các ví dụ tôi tìm thấy không hữu ích lắm. Ai đó có thể chỉ cho tôi một số ví dụ JGraphT đơn giản không? Câu trả lời hay nhất Đây là một ví dụ,
Trong khi giải một bài toán hình học, tôi tình cờ gặp một phương pháp gọi là thuật toán cửa sổ trượt. Thực sự không thể tìm thấy bất kỳ tài liệu/chi tiết học tập nào về nó. Thuật toán nói về cái gì? Câu trả lời hay nhất Tôi nghĩ đó là một kỹ thuật hơn là một thuật toán. Đây là một phương pháp có thể được sử dụng cho nhiều phép tính khác nhau
Tôi đang tìm hiểu các phương pháp được đồng bộ hóa để ngăn chặn tình trạng cạnh tranh và hành vi không mong muốn trong Java. Tôi đã xem ví dụ sau và được cho biết rằng điều kiện chủng tộc rất tinh tế: public class Messages { private String Messa
Tôi có 1 triệu tệp pdf, làm cách nào tôi có thể chuyển đổi chúng thành văn bản bằng hadoop và sử dụng chúng để phân tích. Mục tiêu là trích xuất dữ liệu pdf thành văn bản bằng sức mạnh của hadoop. Câu trả lời hay nhất Tôi đã xử lý bản pdf trên Hadoop
Như hiện tại, câu hỏi này không phù hợp với định dạng Hỏi & Đáp của chúng tôi. Chúng tôi mong đợi câu trả lời sẽ được hỗ trợ bởi các sự kiện, trích dẫn hoặc chuyên môn, nhưng câu hỏi có thể gây ra tranh luận, tranh luận, bỏ phiếu hoặc thảo luận mở rộng. Nếu bạn cảm thấy vấn đề này có thể được cải thiện và có thể mở lại, hãy truy cập
Tôi đã đọc rằng việc ném từ hàm hủy không phải là một ý tưởng hay do việc giải phóng ngăn xếp. Tôi không chắc là tôi hiểu đầy đủ. Vì vậy, tôi đã thử ví dụ sau struct foo { ~foo() { Throw 1;
Ai đó có thể cho tôi biết một ví dụ (mã) đơn giản hiển thị cách sử dụng reply.encodeURL() không? Tất cả tìm kiếm của tôi (bao gồm cả google và stackoverflow) chỉ cung cấp mã hóaURL()
Tôi bị mắc kẹt với các loại haskell. {-# LANGUAGE OverloadedStrings #-} mô-đun Chính (chính) nơi nhập đủ điều kiện
Tôi là một lập trình viên xuất sắc, rất giỏi!