大佬教程收集整理的这篇文章主要介绍了c – 为什么static_cast可以编译将指针转换为智能指针,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
int main() { char foobar[4] = "Foo"; std::unique_ptr<char[]> myptr = static_cast<decltype(myptr)>(foobar); myptr.reset(); return 0; }
这里发生的是myptr试图释放foobar.
我不是在问什么是智能指针或如何分配或以其他方式修复上述内容.
我认为这个问题应该在编译时捕获,因为这些类型应该是完全不兼容的.
为什么在编译时没有检测到这个?
#include <iostream> #include <memory> using std::cout; using std::endl; class Something { public: explicit Something(int) { cout << __PRETTY_FUNCTION__ << endl; } }; int main() { auto something = static_cast<Something>(1); (void) something; }
如果您想知道为什么static_cast会调用std :: unique_ptr的构造函数,可以用标准中的以下引用来解释(强调我的)
静态演员[exPR.static.cast / 4]
所以基本上在你的例子中,数组被视为unique_ptr的构造函数的参数,然后虚构的临时用于初始化变量myptr(在大多数情况下使用elision)
在您的示例中调用的构造函数是(2)在以下cppreference页面http://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr中
explicit unique_ptr( pointer p ) noexcept;
然后,当您调用reset()时,unique_ptr会尝试使用自动生存期删除该变量,并导致未定义的行为.然而,编译器不需要检测到这一点.
以上是大佬教程为你收集整理的c – 为什么static_cast可以编译将指针转换为智能指针全部内容,希望文章能够帮你解决c – 为什么static_cast可以编译将指针转换为智能指针所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。