C++制作和销毁unique_ptr指针
C++ making and destroying unique_ptr pointer
我正在学习将指针与std::unique_ptr
一起使用的方法。我的代码:
#include <iostream>
#include <memory>
class object{
public:
void say(){
std::cout<<"hi";
}
};
int main(){
std::unique_ptr<object> p =
std::unique_ptr<object>(new object);
p->say();
}
我的问题是:
我是否正确使用
std::unique_ptr
?如何删除或删除此 (
p
) 指针,以便没有内存使用或泄漏?
std::unique_ptr<object> p = std::unique_ptr<object>(new object);
这很好,但您可以像这样简化它:
std::unique_ptr<object> p { new object{} };
或者像 C++14 中的这样:
auto p = std::make_unique<object>();
你不需要delete
std::unique_ptr
,这就是重点。当p
超出范围时(在main
结束时),笔尖将自动delete
d。
也就是说,在此示例中无需使用动态分配。您应该只使用自动变量:
int main(){
object p{};
p.say();
}
一个好的经验法则是尽可能使用自动存储持续时间,在必须使用动态存储持续时间时使用动态存储持续时间。
std::make_unique
具有在以下情况下防止泄漏的优点:
process(std::unique_ptr<object>(new object), iMightThrow());
如果先执行new object
,则iMightThrow
运行和抛出,内存将被泄漏。 std::make_unique
防范这一点:
process(std::make_unique<object>(), iMightThrow());
现在,如果iMightThrow()
抛出,std::unique_ptr
要么没有被创建,要么将被销毁并回收内存。
std::unique_ptr<object> p(new object);
就足够了。
你不必对它做任何事情,在它超出范围后,它会破坏对象。
是的,你用对了。但是,如果 C++ 14 可用,您可以像这样创建它:
auto p = std::make_uniuqe<object>();
关于删除它。它不需要删除。这是一般智能指针的想法。当超出范围时,它将删除自己分配的内存。
-
是的,您没有以不好的方式使用
unique_ptr
。unique_ptr
使用资源获取即初始化范例 - 即管理新对象是unique_ptr的责任。 -
这意味着您不必显式删除指针
p
,因为当unique_ptr
超出范围(块的末尾,或在这种情况下为函数)时,其析构函数将设法以正确的方式释放内存而不会造成任何泄漏。
查看以下代码(其工作原理与unique_ptr
类似):
template<class T>
class ScopedPointer : NonCopiable{
private:
T * pointer;
public:
ScopedPointer( T *p): pointer(p){};
virtual ~ScopedPointer(){
delete pointer;
};
T * operator->() const {return pointer;};
T & operator*() const {return *pointer;};
};
ScopedPointer
析构函数将负责删除原始指针!
如果你可以使用C++ 14,你可以有一个简短的手:
auto p = std::make_unique<object>();
这里没有内存泄漏,unique_ptr包装堆分配,当它超出范围时,它会释放资源。你不需要手动释放它,只需将其用作普通变量,当然要注意它的范围。
- 为什么 std::unique 不调用 std::sort?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 生成"unique"矩阵
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 我对 std::unique(算法)C++有问题
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++中的指针否定 (!ptr == NULL)
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误