我疯狂地在我的功能中重新创建一个小型垃圾收集系统吗?

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这样的概念,如果已经有一个满足您要求的具体实施,您仍然会重新发明轮子.


Ark*_*nez 10

你应该使用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.


Căt*_*tiș 2

您不必依赖垃圾收集。

您有 std::auto_ptr ,它提供类似指针的语法并包装动态分配的对象。当销毁时,它会自动销毁它指向的对象。

您可以为数组实现类似的东西。

  • @Neil,如果OP不使用它来跟踪需要删除的内容,则不清楚OP是否需要将它们放入std容器中。也就是说,auto_ptr 使用起来要困难得多...... (2认同)