构造函数和析构函数调用的数量相等,可以确保没有内存泄漏
Does equal amount of constructor and destructor calls ensure no memory leaks?
假设我们有一个名为memoryCounter
的类,它试图捕获由MyClass
类引起的内存泄漏。
class memoryCounter
{
public:
static int MyClassCount;
};
int memoryCounter::MyClassCount = 0;
假设我们在MyClass
的构造函数和析构函数(以及它拥有的任何其他构造函数,也假设我们不在构造函数/析构函数之外的任何其他地方修改MyClassCount
)中放入以下行:
MyClass()
{
memoryCounter::MyClassCount++;
}
virtual ~MyClass()
{
memoryCounter::MyClassCount--;
}
现在,我们能绝对确定如果memoryCounter::MyClassCount
包含零,那么我们迄今为止分配的所有内存都被释放了,并且没有泄漏吗?或者,是否会出现这样的情况:变量将包含零,但将分配我们没有释放的内存(请考虑"MyClass"也是基类或派生类的情况)?
不,你不能。也可以有其他构造函数(至少复制构造函数)。你不算他们。
此外,static
变量的销毁也不容易计数,因为它们是在main
退出后销毁的
如果计数为零,则不存在MyClass
的实例。无论MyClass
对象是完整对象、基类子对象,还是成员子对象,它都适用。这并不一定意味着没有内存泄漏,因为MyClass
本身可能会泄漏内存。
需要注意的是默认生成的复制构造函数。你说假设"它拥有的任何其他构造函数"增加你的全局计数,但很容易错过代码中没有出现的构造函数。你可以在这里应用三条规则——你定义了一个析构函数,所以你应该定义一个复制构造函数。请注意,规则还告诉您定义了一个副本分配运算符,在这种情况下不需要它。
因此,答案是否。您已经统计了通过标准构造函数创建的类实例。不多不少。
您假设MyClass(及其派生的任何东西)是正确编写的。特别是,这种泄漏不会被检测到:
class BadClass : private MyClass
{
public:
BadClass() { int *x = new int(5); }
}
你的计数器所做的是告诉你,每个构造都有一个破坏,这意味着没有人泄露任何"MyClass"对象。
但这并不等同于没有内存泄漏。
- valgrind-hellgrind与泄漏检查的结果不同
- 如何确保C++函数在定义之前声明(如override关键字)
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 使用Unique_ptr确保工厂中的对象唯一
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 尽管遵循了规则,内存泄漏在哪里
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 确保流程关闭
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- Klocwork Inside的资源泄漏
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 如何使用QSGGEOMETRYNODE而不会导致内存泄漏并确保正确清理
- 构造函数和析构函数调用的数量相等,可以确保没有内存泄漏