假設我有一個類型爲std :: vector :: iterator的變量x,該變量x被分配(出於其他原因)並帶有新的位置,例如,C++調用嵌套模板類析構函數
new((void*)&x) std::vector<int>::iterator();
如何以符合標準的方式調用其析構函數?做
x.std::vector<int>::iterator::~iterator();
例如在gcc工作,但不鐺。
假設我有一個類型爲std :: vector :: iterator的變量x,該變量x被分配(出於其他原因)並帶有新的位置,例如,C++調用嵌套模板類析構函數
new((void*)&x) std::vector<int>::iterator();
如何以符合標準的方式調用其析構函數?做
x.std::vector<int>::iterator::~iterator();
例如在gcc工作,但不鐺。
所有標準(和標準兼容)迭代器都遵循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;
}
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;
}
UPDATE:耶。這是一個叮噹聲中的錯誤:http://llvm.org/bugs/show_bug.cgi?id=12350。 See Dieter Lücking's comment。
我對你們非常遺憾,尤其是對OP,爲this mess。
它不是析構函數聲明,而是析構函數調用。 (你的回答在之前更好)。它實際上是鏗鏘蟲:http://llvm.org/bugs/show_bug.cgi?id=12350 –
@DieterLücking你是對的。請不要像我一樣。 –
或者它可能不是一個錯誤,但鏗鏘探測C + +錯誤沒有其他編譯器可以看到? https://bugzilla.mozilla.org/show_bug.cgi?id=623303 –
x是什麼? –
考慮x是C結構的成員,例如'struct A {std :: vector :: iterator x; ...}'你得到一個'struct A *'來初始化和銷燬。 (在我的情況下,它是一個Python擴展類實例。) –
robertwb