Phi*_*l H 8 c++ garbage-collection
我有一些(C++)函数,每个函数包含多个调用,在堆上创建相同基本类型的类似数组.在这些函数的不同点,我可能需要抛出异常.跟踪哪些数组已被删除是一件痛苦的事情,而且非常容易出错,因此我在考虑将数组指针添加到a中Set<ArrType*>,当我捕获异常时,我可以删除每个项目,如下所示:
try
{
set<ArrType*> sHeap;
ArrType* myArr = new ArrType[5];
sHeap.Add(myArr);
someExternalRoutine(myArr);
...
}
catch(CString s)
{
DeleteAllPointersInMyHeap(sHeap);
throw(s);
}
Run Code Online (Sandbox Code Playgroud)
感觉有点像添加本轮,但我无法解决这样一个事实,即几个外部调用中的任何一个都可能抛出异常,我需要明确删除分配到该点的所有指针.
这只是愚蠢吗?我应该在外部调用周围添加较小的try-catch块吗?我最终还是会删除一些删除A的列表; 删除B; 删除D; 每一个......之后
Nic*_*yer 19
为什么不使用智能指针boost::shared_array或使用堆栈分配std::vector?对于单个分配而不是数组分配,您可以使用boost::shared_ptr.
这些为您实现RAII.即使您正在重新使用像RAII这样的概念,如果已经有一个满足您要求的具体实施,您仍然会重新发明轮子.
小智 8
代替
try
{
set<ArrType*> sHeap;
ArrType* myArr = new ArrType[5];
sHeap.Add(myArr);
someExternalRoutine(myArr);
...
}
Run Code Online (Sandbox Code Playgroud)
您只需要:
{
std::vector <ArrType> myArr(5);
someExternalRoutine(myArr);
}
Run Code Online (Sandbox Code Playgroud)
没有阻挡块.所有分配和释放(无论是否抛出异常)都将为您处理 - 这是RAII.
您不必依赖垃圾收集。
您有 std::auto_ptr ,它提供类似指针的语法并包装动态分配的对象。当销毁时,它会自动销毁它指向的对象。
您可以为数组实现类似的东西。
| 归档时间: |
|
| 查看次数: |
400 次 |
| 最近记录: |