我对cpp比较陌生,所以如果这是一个愚蠢的问题,请原谅。我正在学习智能点,但我想知道以下几点:为什么std::unique_ptr
允许使用左值构造an ?
只允许构造std::unique_ptr
带有右值的a以避免像这样的邪恶事情会更安全:
std::unique_ptr<int> createInt() {
int* a = new int(99);
std::unique_ptr<int> foo(a);
delete a;
return foo;
}
我意识到您必须疯狂地编写类似的东西,但是很高兴编译器为此大吼大叫。所以我不禁要问,为什么unique_ptr的左值初始化是一件事情?
编辑:用户@aler egal更卑鄙地提出了我的想法:
“原则上,您可以拥有一个构造函数unique_ptr(int * && ptr),该构造函数假定ptr拥有所有权,然后将其设置为null。在此特定示例中,这将防止使用free-after-free(因为您将被迫进行std :: move(a),因为在空指针上调用delete无效),但这将是非常奇怪的反模式。”
这是一个悬空指针的经典示例!与智能指针看上去相反,它们只是普通(原始)指针的包装,后者可以自行管理内存并为您提供一些附加功能。
考虑以下示例:
int* someFunc() {
int* ptr;
int* ptr2 = ptr;
delete ptr;
return ptr2;
}
这就是您要做的。
他们已经做了这样它们可以被用来代替原所属指针在任何时候 ; 意思是,它们也可以悬挂!因此,如果不允许它们进行左值初始化,那么这是一个不能使用智能指针的用例,尽管我同意,但是这是不使用两者的一种情况!
上面带有智能指针的代码将完全是您尝试过的代码。
现在,C ++完全给您留下了逻辑。如果您想用脚射击自己,那就继续吧,C ++不会吠叫。C ++不检查内存使用情况,缓冲区溢出以及已删除内存的访问。简而言之,这是C ++程序员的工作,如果他/她想用脚开枪,他/她可以自由地这样做!
另外,通常建议std::make_ptr()
在ctor 上使用,因为前者已启用例外
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句