Tôi đang sử dụng một destructor inplace trong mã của tôi, tương tự như sau lột xuống đoạn mã:C++ destructor inplace biên dịch cảnh báo
#include <new>
#include <stdlib.h>
struct Node {
};
int main(int, char**) {
Node* a = reinterpret_cast<Node*>(malloc(sizeof(Node)));
new(a) Node;
Node* b = a;
b->~Node();
free(a);
}
Thật không may này mang lại cho tôi một lời cảnh báo trong Visual Studio 2015, cả trong Debug và Release :
warning C4189: 'b': local variable is initialized but not referenced
Nó biên dịch tốt mặc dù trong g ++, ngay cả với Wall. Bất kỳ ý tưởng tại sao tôi nhận được cảnh báo? Có thể đây là một lỗi trong trình biên dịch? b được sử dụng rõ ràng trong cuộc gọi b->~Node()
.
Nó cũng dường như biên dịch tốt khi tôi thay đổi việc thực hiện Node này:
struct Node {
~Node() {
}
};
Nhưng như xa như tôi có thể nói điều này không nên tạo sự khác biệt.
Hmm, tôi đoán là trình tối ưu hóa sẽ bỏ qua cuộc gọi đến trình phá hủy mặc định hoàn toàn, và sau đó kết luận rằng 'b' không bao giờ được sử dụng. Bạn có thấy cảnh báo này chỉ khi bạn biên dịch một bản dựng được tối ưu hóa hoặc bạn có thấy nó trong các bản dựng chưa được tối ưu hóa/gỡ lỗi không? –
Nó cũng nằm trong bản dựng lỗi – martinus
Thú vị. Vâng, tôi repro với trình tối ưu hóa được kích hoạt và vô hiệu hóa, cho cả hai 32-bit và 64-bit xây dựng, và trên VS 2010, 2012, và 2015. Trông giống như một lỗi cho tôi, trừ khi tôi cũng thiếu một cái gì đó rõ ràng. (Nó * là * eliding cuộc gọi đến destructor trong xây dựng tối ưu, tất nhiên, và trên thực tế, cũng eliding cuộc gọi đến constructor. Mã đối tượng chỉ gọi 'malloc' và' free'.) –