c++:不删除对象/总是/内存泄漏
C++: Is not deleting an object /always/ a memory leak?
class MyClass
{
// empty class with no base class
};
int main()
{
MyClass* myClass = new MyClass();
return 0;
}
这是内存泄漏吗?
是。即使您的类是空的,您仍然会泄漏内存。这有几个原因:
- 分配永远不会是零长度。您的操作系统不会返回一个零字节的缓冲区。有一个最小分配大小,这是你分配一个零字节结构时得到的大小。(在我的机器上,它是16字节)
- 即使存在零长度分配,对象也至少有1字节大(其中一个字节的大小与
char
的大小相同)。 - 即使您确实获得了零长度分配,您的操作系统也必须跟踪此分配。为此,它使用更多的字节将地址映射到其分配细节。这有一个常量大小的内存开销,你得到每次分配内存。
所以,你的代码泄漏了至少一个字节的内存,加上分配细节,即使你的结构是空的。
任何时候都有内存泄漏
- 你动态分配一个对象,然后
- 将丢失所有指向动态分配对象的指针和引用
此时,您无法销毁动态分配的对象,因此该对象被泄漏。
在您的示例程序中,您动态分配MyClass
对象并设置myClass
指向它。myClass
是指向动态分配对象的唯一指针。然后从函数返回并丢失指针;此时,动态分配的MyClass
对象泄露了。
这是否重要取决于对象是什么,程序是什么,以及泄漏发生的时间。如果对象在被销毁时不需要做任何清理(例如,如果它的析构函数是微不足道的),那么在程序终止之前没有销毁它通常是糟糕的风格,但相对于其他类型的泄漏来说,并不是特别糟糕。
请注意,所有内容都保证至少是c++字节的大小,其大小始终与char
相同。(在不同的系统上,具体情况可能会有所不同,但通常是8位。请与CHAR_BIT
核实。)所以,是的,它将占用内存(尽管很少)并且内存将被泄漏。
因此,不删除对象实际上总是会泄漏内存。
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- QueryWorkingSet总是返回false
- 无论条件是否为true,if总是在c++中执行
- C++A*算法并不总是在路径中具有目标节点
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 为什么(-1)%vector::size()总是返回0
- xmake总是报告:错误:无法获取cxx的程序,为什么
- 类型总是使用其大小存储在内存中吗
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 使用std::istream::peek()总是安全的吗
- OpenMP:并行更新数组总是需要减少数组吗
- 在我的代码中,获得最大的Pair Wise产品C++和输出并不总是正确的
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 为什么 WinDbg 在测试内存泄漏程序时总是返回相同的"!heap -s"信息?
- 不在动态分配的对象上调用delete总是内存泄漏
- c++:不删除对象/总是/内存泄漏