C++自动内存 malloc 和免费覆盖问题
C++ auto memory malloc and free coverity issue
我有一些代码来实现自动分配内存和释放,如下所示:
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
的析构函数被多次调用。
当任何初始化代码抛出异常时,可能还有一个错误,但由于您遗漏了该部分,我们无法确定。
相关文章:
- 使用ios:ate写入到流会覆盖现有文件
- 我可以重新分配/覆盖std::字符串吗
- 叮叮当当在修复时插入多个"覆盖"说明符
- 谷歌模拟和覆盖关键字
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 使用子类覆盖基类中定义的函数
- 当覆盖存在时调用基本虚拟"binded to object"函数
- C++指针在 for 循环中被覆盖
- 如何在cpp中删除(免费)多维结构内存?
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- 存储在堆分配向量中的指针的免费存储
- 为什么我的全局 new() 覆盖被绕过了?
- 被覆盖的函数不会反映在基类中,这是正常行为吗?
- C++找出覆盖同一行的数组
- 专门化模板覆盖函数/避免对象切片
- 重写打印函数而不是覆盖基类
- C++中"覆盖功能的异常规范比基本版本更宽松"的奇怪错误
- 如何在 c++ 中覆盖相同的文本文件
- C++自动内存 malloc 和免费覆盖问题