在这种情况下,静态数组会导致内存泄漏

could static array cause memory leak in this case?

本文关键字:内存 泄漏 数组 这种情况下 静态      更新时间:2023-10-16

//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;
  };

您需要检查几个地方:

  1. 使用"CVMI"的调用方。

    如您所描述的,没有内存泄漏,因为您有"删除"

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

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

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

std1std2 (静态数组)不会导致内存泄漏。上面的代码中甚至没有使用它们,所以不清楚你的标题来自哪里。至于OP注释中提到的虚拟析构函数,这完全取决于Listener的实现是什么,因为VMIListenerCVMI都没有动态分配内存。