int main(){ char foobar[4] = "Foo"; std::unique_ptr<char[]> myptr = static_cast<decltype(myptr)>(foobar); myptr.reset(); return 0;}
这里发生的是myptr试图释放foobar.
我不是在问什么是智能指针或如何分配或以其他方式修复上述内容.
我认为这个问题应该在编译时捕获,因为这些类型应该是完全不兼容的.
为什么在编译时没有检测到这个?
解决方法 static_cast会调用std :: unique_ptr的构造函数,类似于以下示例中的内容#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]
An Expression e can be explicitly converted to a type
T
using astatic_cast
of the formstatic_cast<T>(e)
if the declarationT t(e);
is well-formed,for some invented temporary variablet
(8.5). The effect of such an explicit conversion is the same as performing the declaration and initialization and then using the temporary variable as the result of the conversion. The Expressione
is used as a glvalue if and only if the initialization uses it as a lvalue.
所以基本上在你的例子中,数组被视为unique_ptr的构造函数的参数,然后虚构的临时用于初始化变量myptr(在大多数情况下使用elision)
在您的示例中调用的构造函数是(2)在以下cppreference页面http://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr中
explicit unique_ptr( pointer p ) noexcept;
在这里你得到一个指向数组的unique_ptr.
然后,当您调用reset()时,unique_ptr会尝试使用自动生存期删除该变量,并导致未定义的行为.然而,编译器不需要检测到这一点.
总结以上是内存溢出为你收集整理的c – 为什么static_cast可以编译将指针转换为智能指针全部内容,希望文章能够帮你解决c – 为什么static_cast可以编译将指针转换为智能指针所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)