2014-02-18 32 views
7

假設我有一個類型爲std :: vector :: iterator的變量x,該變量x被分配(出於其他原因)並帶有新的位置,例如,C++調用嵌套模板類析構函數

new((void*)&x) std::vector<int>::iterator(); 

如何以符合標準的方式調用其析構函數?做

x.std::vector<int>::iterator::~iterator(); 

例如在gcc工作,但不鐺。

+3

x是什麼? –

+0

考慮x是C結構的成員,例如'struct A {std :: vector :: iterator x; ...}'你得到一個'struct A *'來初始化和銷燬​​。 (在我的情況下,它是一個Python擴展類實例。) – robertwb

回答

1

所有標準(和標準兼容)迭代器都遵循Iterator concept,要求它是Destructible。因此,只需簡單地調用迭代器的析構函數即可,就如同在用新位置構建的任何其他(非平凡)類型中一樣。

x.~iterator_type(); // where x is an iterator 

注意,如果你通過指針指迭代器,必須使用->操作:

#include <vector> 


int main() { 
    auto buffer = new char[sizeof(std::vector<int>::iterator)]; 

    auto iterator = new((void*)buffer) std::vector<int>::iterator(); 
    iterator->std::vector<int>::iterator::~iterator(); 

    delete[] buffer; 
} 

LIVE EXAMPLE (GCC)

UPDATE:看來鏘有一些問題編譯(我假定符合標準)代碼。您可以通過調用析構函數時提供的間接作出這樣的變通:

#include <vector> 

template<typename T> 
void call_destructor(T* x) { 
    x->~T(); 
} 

int main() { 
    auto buffer = new char[sizeof(std::vector<int>::iterator)]; 

    auto iterator = new((void*)buffer) std::vector<int>::iterator(); 
    //iterator->std::vector<int>::iterator::~iterator(); 
    call_destructor(iterator); 

    delete[] buffer; 
} 

LIVE EXAMPLE (clang)

UPDATE:耶。這是一個叮噹聲中的錯誤:http://llvm.org/bugs/show_bug.cgi?id=12350See Dieter Lücking's comment


我對你們非常遺憾,尤其是對OP,爲this mess

+0

它不是析構函數聲明,而是析構函數調用。 (你的回答在之前更好)。它實際上是鏗鏘蟲:http://llvm.org/bugs/show_bug.cgi?id=12350 –

+0

@DieterLücking你是對的。請不要像我一樣。 –

+0

或者它可能不是一個錯誤,但鏗鏘探測C + +錯誤沒有其他編譯器可以看到? https://bugzilla.mozilla.org/show_bug.cgi?id=623303 –