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]
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;
然后,当您调用reset()时,unique_ptr会尝试使用自动生存期删除该变量,并导致未定义的行为.然而,编译器不需要检测到这一点.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。