C++将新对象添加到列表中以避免实现析构函数

发布于 2025-01-12 03:32:01 字数 145 浏览 0 评论 0原文

将新对象添加到列表并返回指向该项目的指针以模仿 new 运算符的行为是个好主意吗?由于列表为我们处理对象的清理,所以我不必实现析构函数,对吧?

编辑: 例如,我需要实现一个树形数据结构,其节点必须动态分配。我想通过使用我描述的方法来避免在析构函数中遍历树的工作。

Would it be a good idea to add new objects to a list and returning a pointer to that item to mimic the behavior of the new operator? Since the list handles cleanup of objects for us, I wouldn't have to implement a destructor, right?

Edit:
For example, I need to implement a tree data structure, whose nodes would have to be dynamically allocated. I want to avoid the work of traversing the tree in the destructor by using the method I described.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦境 2025-01-19 03:32:01

弹出操作在内部调用每个元素的析构函数。因此,您可能需要关心破坏。下面的代码片段直接取自 std::list 的源代码

// Erases element at position given.
void _M_erase(iterator __position) _GLIBCXX_NOEXCEPT
{
    this->_M_dec_size(1);
    __position._M_node->_M_unhook();
    _Node* __n = static_cast<_Node*>(__position._M_node);
#if __cplusplus >= 201103L
    _Node_alloc_traits::destroy(_M_get_Node_allocator(), __n->_M_valptr());
#else
    _Tp_alloc_type(_M_get_Node_allocator()).destroy(__n->_M_valptr());
#endif
    _M_put_node(__n);
}

,您可以看到 _M_erase 函数在每次调用 时都会被调用pop(..) 调用列表当前正在使用的分配器的 destroy(..) 方法。并且,destroy(..) 函数调用< /a> 显式给定类的析构函数。

template<typename _Up>
void destroy(_Up* __p) 
{ 
    __p->~_Up(); 
}

总之,std::list 或任何其他正确实现的容器提供了对用于包含添加到容器的对象的资源的安全管理。如果您还有其他资源在其包装器(本例中为您的类)被销毁时需要小心,那么您必须显式实现析构函数。

The pop operations internally call the destructor of each element. So, you might need to care about the destruction. The code piece below is taken directly from the source code of the std::list

// Erases element at position given.
void _M_erase(iterator __position) _GLIBCXX_NOEXCEPT
{
    this->_M_dec_size(1);
    __position._M_node->_M_unhook();
    _Node* __n = static_cast<_Node*>(__position._M_node);
#if __cplusplus >= 201103L
    _Node_alloc_traits::destroy(_M_get_Node_allocator(), __n->_M_valptr());
#else
    _Tp_alloc_type(_M_get_Node_allocator()).destroy(__n->_M_valptr());
#endif
    _M_put_node(__n);
}

As you can see the _M_erase function which is called at each time you call the pop(..) calls the destroy(..) method of the allocator which is currently in use by your list. And, the destroy(..) function calls the destructor of the given class explicitly.

template<typename _Up>
void destroy(_Up* __p) 
{ 
    __p->~_Up(); 
}

In conclusion, the std::list or any other properly implemented container provides the safe management of resources that are used to contain the objects added to the container. If you have further resources that requires care when its wrapper (your class in this case) is being destroyed, then you must implement the destructor explicitly.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文