这导致我的程序断言失败:
int a = 5;
std::unique_ptr<int>intptr(&a);
错误
文件:f:\ dd \ vctools \ crt \ crtw32 \ misc \ dbgdel.cpp
行:32
表达式:_BLOCK_TYPE_IS_VALID(pHead&gt; nBlockUse)
使用&#34; new&#34;进行初始化时效果很好或&#34; = make_unique(..)&#34;但我很想知道为什么我可以通过给出现有变量的地址来初始化它。
答案 0 :(得分:2)
您可以初始化。错误是unique_ptr
的破坏,因为默认情况下它是delete
所有者指针。您应该使用new
创建,或使用客户删除。
答案 1 :(得分:2)
变量a在堆栈上,如果将其绑定到unique_ptr,当unique_ptr超出范围时,它将对无法删除的变量调用delete。
基本上你不能获得自动存储变量的所有权,只能获得动态存储变量。
答案 2 :(得分:2)
你可以使用这样的自定义删除器将unique_ptr
初始化为自动变量:
auto noop = [](int*){};
std::unique_ptr<int, decltype(noop)>intptr(&a, noop);
请记住不要让指针逃离自动变量所在的范围。
但是在这里使用unique_ptr
可能没有任何意义,所以你可能想重新考虑你的方法。
答案 3 :(得分:1)
只有当你有一些奇怪的自定义删除程序对实际销毁没有任何作用时,你才可以使用地址。
struct D{
void operator()(int* p) const {
std::cout << "Deleter \n";
//... no actual delete
}
};
int a =5;
std::unique_ptr<int,D> intptr (&a);