计算对象实例的最简单方法

NoS*_*tAl 16 c++ refcounting

我想知道在某个执行点分配的某些对象的确切实例数.主要是为了寻找可能的内存泄漏(我主要使用RAII,几乎没有新的,但在添加新元素或类似的东西之前,我仍然可以在向量上忘记.clear()).我可以有一个

atomic<int> cntMyObject;
Run Code Online (Sandbox Code Playgroud)

我 - 在析构函数中,++增加构造函数,cpy构造函数(我希望我涵盖了一切:)).但这对每个班级来说都是硬编码.在"释放"模式下禁用它并不简单.那么有没有简单优雅的方法可以轻松禁用来计算对象实例?

Cha*_*had 27

有一个"计数对象"类,在其构造函数和析构函数中执行正确的引用计数,然后派生您想要从中跟踪的对象.然后,您可以使用奇怪的重复模板模式为您想要跟踪的任何对象类型获取不同的计数.

// warning: pseudo code

template <class Obj>
class CountedObj
{
public:
   CountedObj() {++total_;}
   CountedObj(const CountedObj& obj) {if(this != &obj) ++total_;}
   ~CountedObj() {--total_;}

   static size_t OustandingObjects() {return total_;}

private:
   static size_t total_;
};

class MyClass : private CountedObj<MyClass>
{};
Run Code Online (Sandbox Code Playgroud)

  • 你不应该真的需要复制ctor中的同一对象检查,因为从它自己复制构造一个对象通常是无效的,所以任何人这样做都已经在玩愚蠢的游戏了.但是,没有任何伤害.插入原子性或锁定味道,但提问者已经知道这一点. (4认同)
  • @NoSenseEtAl:它使NoSenseAtAll有一个正在进行计数的线程.如果使用CountObj,并使其成为要跟踪其对象的类的基类,则在实例化对象的线程的上下文中,计数将递增. (3认同)

Alo*_*ave 9

最好使用Valgrind或Rational Purify等内存分析和泄漏检测工具.

如果你不能并且想要实现自己的机制那么,

您应该为您的类重载newdelete运算符,然后在其中实现内存诊断.

看看这个 C++ FAQ答案,知道如何做到这一点,以及你应该采取什么预防措施.


suk*_*mar 7

你可以应用这种方法

#ifdef DEBUG

class ObjectCount {
    static int count;
  protected:
    ObjectCount() {
        count++;
    }
  public:
    void static showCount() {
        cout << count;
    }
};

int ObjectCount::count = 0;


class Employee : public ObjectCount {
#else
class Employee {
#endif
  public:
    Employee(){}
    Employee(const Employee & emp) {

    }
};
Run Code Online (Sandbox Code Playgroud)

DEBUG模式下,调用ObjectCount::showCount()方法将返回创建的对象的计数.