大多数人都说永远不会从析构函数中抛出异常 - 这样做会导致未定义的行为.Stroustrup指出"向量析构函数显式地为每个元素调用析构函数.这意味着如果元素析构函数抛出,向量破坏失败......实际上没有好的方法来防止从析构函数抛出的异常,所以库如果元素析构函数抛出",则不保证"(来自附录E3.2).
这篇文章似乎另有说法 - 抛出析构函数或多或少都没问题.
所以我的问题是 - 如果从析构函数抛出会导致未定义的行为,那么如何处理析构函数期间发生的错误?
如果在清理操作期间发生错误,您是否只是忽略它?如果它是一个可能在堆栈中处理但在析构函数中不正确的错误,那么从析构函数中抛出异常是否有意义?
显然,这类错误很少见,但可能.
为什么使用std::auto_ptr<>标准容器是错误的?
从头开始设计新系统.我将使用STL来存储某些长寿命对象的列表和地图.
问题:我是否应该确保我的对象具有复制构造函数并在我的STL容器中存储对象的副本,或者通常更好地自己管理生命和范围并将指针存储到我的STL容器中的那些对象?
我意识到这在细节方面有点短暂,但我正在寻找"理论上"更好的答案,如果它存在,因为我知道这两种解决方案都是可能的.
使用指针的两个非常明显的缺点:1)我必须在超出STL的范围内管理这些对象的分配/释放.2)我无法在堆栈上创建临时对象并将其添加到我的容器中.
还有什么我想念的吗?
为了安全地清理向量或指针列表,你可以用最短的C++块来实现什么?(假设您必须在指针上调用delete?)
list<Foo*> foo_list;
Run Code Online (Sandbox Code Playgroud)
我宁愿不使用Boost或用智能指针包装我的指针.
毫无疑问,我会选择将STL用于大多数C++编程项目.最近我提出了这个问题,"有没有你不会使用STL的情况?"......
我越是想到它,我就越意识到也许应该是我选择不使用STL的情况......例如,一个非常大的长期项目,其代码库预计将持续数年......也许是真正符合项目需求的定制容器解决方案值得最初的开销吗?你怎么想,有没有你选择不STL的情况?
我担心通过执行以下操作会遇到内存泄漏问题:
(示例代码)
class myItem //random container stuff mostly. All primatives.
{
int index;
char* name;
int val1;
int val2;
};
class vecList
{
vector< myitem* > *myVec;
void delete()
{
MyVec->erase(std::remove_if(myVec->begin(), MyVec->end(), IsMarkedToDelete), MyVec->end()); //leak here?
}
};
Run Code Online (Sandbox Code Playgroud)
如果它是一个指针,擦除不释放内存,对吗?如果我没有使用remove_if,我可以在销毁之前调用指针上的delete.在这种情况下我该怎么做?智能指针?我不想用它们重新实现所有内容,我真的不想添加boost库.
谢谢!
c++ ×7
stl ×4
raii ×2
auto-ptr ×1
c++-faq ×1
containers ×1
destructor ×1
erase ×1
exception ×1
memory-leaks ×1
pointers ×1
remove-if ×1
stack ×1
vector ×1