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

时间:2013-11-04 21:24:30

标签: c++ memory-leaks

// 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循环。如果在循环中放入以下三行,那么我注意到我的记忆会从屋顶射出。

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

2 个答案:

答案 0 :(得分:1)

您需要检查几个地方:

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

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

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

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

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

答案 1 :(得分:0)

您的静态数组

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