C++自动内存 malloc 和免费覆盖问题

C++ auto memory malloc and free coverity issue

本文关键字:免费 覆盖 问题 malloc 内存 C++      更新时间:2023-10-16

我有一些代码来实现自动分配内存和释放,如下所示:

struct AutoAllocator
{
AutoAllocator(ptr,size),objptr(ptr)
{ 
some malloc  here…
some init memory here…
}
bool isValid()
{ return objptr != 0;}
~AutoAllocator()
{ 
if(objptr ==0)return;
some free code here;
}
private:
BYTE* &objptr;
};
#define AUTO_AULLOCATOR(ptr,size)
for(AutoAllocator            autoObj(ptr,size);autoObj.isValid();autoObj.~AutoAllocator())

当我使用

Ptr * obj;
AUTO_ALLOCATOR(obj,size)
{
Some code here
return;
}

。 Coverity提醒我obj指针超出范围泄漏了它指向的存储

我想知道我该如何解决这些遮盖问题?

有什么帮助吗?

最好的解决方案是放弃这种方法。最好的结果将是一个脆弱的解决方案,如果不"正确"使用,就会破裂。这既会发生在缺乏经验的C++程序员身上(他们不会在他们的书中找到你的结构),也会发生在经验丰富的程序员身上,他们编写RAII风格的现代C++代码。

使用基于宏的解决方案是第一个问题。它会导致编译器看到与使用该宏的程序员不同的代码结构。 第二个问题是宏隐藏了一个非平凡的结构 - 一个for循环。如果宏被命名为FOR_something,这可能是可以原谅的,但这里根本没有提示。事实上,宏的名称暗示了某种auto功能,这是类型推断的C++关键字。它根本不这样做。

接下来,我们有Coverity检测到的问题。似乎诊断并不完全正确,但这并非不合理。Coverity 为常见的小问题(如内存泄漏)提供了良好的信息。这段代码太糟糕了,以至于 Coverity 无法推断出意图是什么,所以它必须猜测你的意图。形式上的问题是autoObj的析构函数被多次调用。

当任何初始化代码抛出异常时,可能还有一个错误,但由于您遗漏了该部分,我们无法确定。