析构函数可能不会抛出异常(因此在异常处理期间可以完成堆栈展开),并且必须释放分配给该对象的任何资源(因此不会泄漏资源).包含多个其他对象(或分配了多个资源)的对象的设计可能会在STL容器中记录指向它们的指针.因此析构函数将使用以下与迭代器相关的方法:
begin(),end()对于容器operator++ 对于有效的迭代器operator*或者operator->对于有效的迭代器但是为了保证析构函数不会抛出异常并释放其资源,您需要依赖那些永远不会抛出异常的方法.
依赖那些从不抛出异常的方法是否安全?很难想象一个实际的实现会抛出异常,因为STL迭代器本质上是一个指针.但标准C++是否要求这些方法永远不会抛出异常?我没有在C++标准中找到明确的陈述.
编辑:有趣的情况是C++ 03,当你想拥有一个指向资源的容器.这样做有充分的理由; 例如,如果您有多态资源.正如BjörnPollex在他的回答中指出的那样,如果你使用一个资源容器(比如a std::list< Resource >)而不是一个指向资源的指针的容器,容器的析构函数将为你处理对象的破坏(释放)Resource.
一些开源库倾向于重新实现基本结构,如字符串,列表,堆栈,队列......为什么他们不使用stl库?是不是还不够好?
我在大学课程中学习了数据结构和算法,他们教我们如何实现它们。在阅读了 SO 和 Quora 上的一些答案后,似乎建议使用 STL 容器。
我对所有C++编码器都有一个小问题!对于您来说,它是否与"C++哲学"兼容,以重新编码您自己的智能指针.实际上我将shared_ptr与weak_ptr一起用于项目,但它使代码过于复杂.我当然可以使用raw_ptr,但是......它是"普通c"......所以你怎么看待它?我应该重新编写自己的智能指针还是继续将shared_ptr与weak_ptr一起使用