Explicit delete and new vs using a unique_ptr
我有一个回调传递给异步函数,该函数只负责删除传递给异步函数的指针。
我应该如何删除指针:
通过使用显式删除。
通过创建一个将删除对象的 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 拥有 myClass 的所有权,因为它已被 moved 到 lambda 捕获中。
您也可以省略 p.reset() 并在 lambda 死亡时让指针死亡,我假设(取决于 AsyncFunc)是在调用 lambda 之后立即发生的。
- 听起来他不想传递一个异步运行的函数,听起来 AsyncFunc 异步做了一些未指定的工作,他想要一个函数在之后调用以清理内存,在这种情况下,他只需要一个 std::unique_ptr .很难说他想做什么。
-
@David 哦,我明白了,是的,我同意所有观点——这取决于他想要做什么。目前还不清楚。
-
c 11 支持这种语法吗?看起来它仅在 c 14 中受支持,我需要使用 c 11。
-
@user844541 好吧,如果您不能使用 c 14,我想我会做同样的事情,但使用 shared_ptr,其中 lambda 在复制后是 shared_ptr 的唯一所有者