1
hitmanx 2015-07-16 17:16:47 +08:00 2
挺有意思的,我做了几个实验。
namespace NS_A { class A { public: A(){std::cout << "A ctor" << std::endl;} ~A(){std::cout << "A dtor" << std::endl;} }; } namespace NS_B { void test() { NS_A::A* a = new NS_A::A; a->~A(); // ok operator delete(a); } } int main() { NS_B::test(); return 0; } ============================== 但是如果这儿加上一个typedef,情况就不一样了。 namespace NS_A { class A { public: A(){std::cout << "A ctor" << std::endl;} ~A(){std::cout << "A dtor" << std::endl;} }; typedef NS_A::A CloneA; // add typedef here } namespace NS_B { void test() { NS_A::CloneA* a = new NS_A::CloneA; a->~CloneA(); // oops, we end up with compile error here operator delete(a); } } int main() { NS_B::test(); return 0; } =============================================== 如果加上一句“using NS_A::CloneA;”,编译就又没有问题了。 同样的,string是一个typedef,原型是模板类basic_string的一个特化。如果这儿改成它的原型,比如改成以下这样,是可以编译的。 int main() { std::string *sp = new std::string("hehe"); sp->~basic_string(); // ok now operator delete (sp); return 0; } |
2
clapse 2015-07-16 21:59:23 +08:00
楼上举的例子:
a->~CloneA(); // oops, we end up with compile error here 此处编译器尝试去解释成 A::~CloneA(),没有成功 使用 using NS_A::CloneA; 或者 a->NS_A::CloneA::~CloneA(); 此处编译器将~CloneA()替换成了~A(),编译通过 我这样理解对吗? |