我用我的代碼就地析構函數,類似這樣的精簡一段代碼:C++就地析構函數編譯警告
#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);
}
不幸的是這給了我在Visual Studio 2015年警告,無論是在Debug和Release :
warning C4189: 'b': local variable is initialized but not referenced
它編譯罰款雖然G ++,甚至-Wall。任何想法爲什麼我得到警告?可能這是編譯器中的一個錯誤? b清楚地在b->~Node()
呼叫中使用。
它也似乎當我改變的節點執行這個編譯罰款:
struct Node {
~Node() {
}
};
但據我可以說,這不應該有所作爲。
嗯,我的猜測是,優化器完全拋棄了對默認析構函數的調用,然後得出結論認爲'b'永遠不會被使用。只有在編譯經過優化的版本時纔會看到此警告,或者您是否在未優化/調試版本中看到此警告? –
它也在調試版本 – martinus
有趣。是的,我在優化器啓用和禁用的情況下對32位和64位版本以及VS 2010,2012和2015進行了重新編譯。對我來說看起來像是一個bug,除非我還缺少一些明顯的東西。 (當然,它*是*在優化構建中消除了對析構函數的調用,事實上,它也消除了對構造函數的調用。目標代碼只調用'malloc'和'free'。) –