0

//CVMI.cpp

static char* std1[] = {"a","b","c"};
static char* std2[] = {"1","2","3"};

CVMI::CVMI(HWND p)
{
  //Does nothing.
}

//CVMI.h

const int   cMaxIPAddr = 100;
class CVMI : public VMIListener
{
 public:
CVMI(HWND p); 
    VMI vmi;
bool    bOpen;
    char                sVoceraIPAddr[cMaxIPAddr + 1];
long                iMessageID; 
};

以上是我在线程中使用并运行 for 循环的类的代码。如果将以下三行放在那个 for 循环中,那么我注意到我的记忆会飞速发展。

m_pVMI = new CVMI(m_hNotifyWnd);
delete m_pVMI;
m_pVMI = NULL;

我在这里做错了什么?我虽然我的删除每次都会处理内存分配。还是我必须专门释放析构函数〜CVMI()中的所有资源?. 这是我第一次尝试解决内存泄漏问题,而作为 C++ 初学者并不容易。

编辑:

 class VMI_API VMIListener : public Listener
 {                                                                                      

 public:

// Message acknowledgement.  iAckCode is one of AC codes.
virtual void    HandleAck(long iMessageID, char* sLoginID, int iAckCode) = 0;   
virtual void    HandleResponse(long iMessageID, char* sLoginID, char* sResponse) = 0;
virtual void    HandleConnectionFailed(void) = 0;
  };
4

2 回答 2

1

您需要检查几个地方:

  1. 使用“CVMI”的调用者。

    正如你所描述的,没有内存泄漏,因为你有“删除”

    m_pVMI = new CVMI(m_hNotifyWnd);
    delete m_pVMI;
    m_pVMI = NULL;
    
  2. “CVMI”类

    根据您的代码,您“新建”并立即“删除”并且您的构造函数什么都不做,那么这不是内存泄漏的地方。

  3. 唯一可疑的地方是“VMIListener”或基类“Listener”的构造函数(如果那个也有基类,请检查基类......),也许它分配给一个内存变量,如:m_foo = new CFoo(); 在构造函数中;但是,如果您没有为“VMIListener”(或侦听器或超类)定义析构函数,则可以保证内存泄漏。

于 2013-11-04T21:46:04.440 回答
0

std1并且std2,您的静态数组不会导致您的内存泄漏。它们甚至没有在上面的代码中使用,所以不清楚你的标题来自哪里。至于OP评论中提到的虚拟析构函数,它完全取决于什么Listener是实现,因为既不是动态分配内存VMIListener也不CVMI是动态分配内存。

于 2013-11-04T21:45:55.860 回答