关于 c :Explicit delete and new vs using a unique_ptr
Explicit delete and new vs using a unique_ptr
我有一个回调传递给异步函数,该函数只负责删除传递给异步函数的指针。
我应该如何删除指针:
对于对象的创建也有同样的问题 - 我应该使用 new 还是创建一个 unique_ptr 并立即释放它。
|
1
2 |
MyClass* myClass = make_unique<MyClass>().release();
AsyncFunc(myClass, [myClass](){std::unique_ptr<MyClass>(myClass)} |
vs
|
1
2 |
MyClass* myClass = new MyClass();
AsyncFunc(myClass, [myClass](){delete myClass;)} |
相关讨论
-
AsyncFunc 的声明是什么? -
如果
AsyncFunc 取得myClass 的内存所有权,那么理想情况下它应该接受一个std::unique_ptr<MyClass> 以在语义上表明它这样做。在这种情况下,您不需要传递回调来删除指针,只要AsyncFunc 完成使用它,它就会被删除。但是,如果没有更多信息,就很难确定您要达到的目标。 - 我认为不需要显式删除。我想知道你想归档什么。在将指针传递给异步删除之前,如何创建和使用该指针非常重要。 std::auto_ptr 会做得很好。我认为你是从错误的angular解决它。从头开始。
-
MyClass* myClass = make_unique<MyClass>().release(); 行完全没有意义。
都没有。
你应该这样做……
|
1
2 3 4 5 |
auto myClass = make_unique<MyClass>();
// hand out pointers to myClass by using myClass.get() as needed AsyncFunc([p = std::move(myClass)]{ p.reset(); }); // make sure any pointers to myClass you handed out are unused/gone // by the time the async func is called |
这样你永远不会通过原始指针持有所有权(你不应该这样做),并且 lambda 拥有
您也可以省略
相关讨论
- 听起来他不想传递一个异步运行的函数,听起来
AsyncFunc 异步做了一些未指定的工作,他想要一个函数在之后调用以清理内存,在这种情况下,他只需要一个std::unique_ptr .很难说他想做什么。 - @David 哦,我明白了,是的,我同意所有观点——这取决于他想要做什么。目前还不清楚。
- c 11 支持这种语法吗?看起来它仅在 c 14 中受支持,我需要使用 c 11。
-
@user844541 好吧,如果您不能使用 c 14,我想我会做同样的事情,但使用
shared_ptr ,其中 lambda 在复制后是shared_ptr 的唯一所有者
THE END
二维码