Visual C++ 内存泄漏

Visual C++ memory leak

我正在创建一个串行通信库,它是一个托管程序集,它有自己的规则(我不完全理解它们,我只是在 VS 抱怨时更改代码),我有记忆我无法弄清楚的泄漏。

这是我收到的泄漏警告(第 11 行是 SerialComm::SerialComm() 中的 InfoContainer 构造函数):

Detected memory leaks!
Dumping objects ->
SerialComm.cpp(11) : {144} normal block at 0x011468B8, 56 bytes long.
Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Object dump complete.

这是库的 .h 文件:

#include <windows.h>
#include <stdlib.h>
#include <atlstr.h>

public class InfoContainer {
public:
    ~InfoContainer();
    HANDLE handle;
    bool connected;
    COMSTAT status;
    DWORD errors;
    DCB connection_params;
    CStringA port_name;
};

public ref class SerialComm {
public:
    InfoContainer* info=0;
    SerialComm();
    ~SerialComm();
    bool OpenConnection(String^ Portname);
    int CloseConnection();
    bool WriteData(String^ toSend);
    String^ ReadData(int bytesToRead);
};

这些是相关的 .cpp 部分:

SerialComm::SerialComm() {
    info = new (_NORMAL_BLOCK, __FILE__, __LINE__) InfoContainer();
    info->handle = 0;
}
SerialComm::~SerialComm() {
    CloseConnection();
    delete info;
}

bool SerialComm::OpenConnection(String ^ Portname) {
    info->port_name = Portname;

    //visual studio's valgrindish tool
    _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
    _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
    _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
    _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
    _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
    _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    _CrtDumpMemoryLeaks();


    info->handle = CreateFileA(
        info->port_name,
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        0,
        NULL

    );
    if (info->handle == INVALID_HANDLE_VALUE) {
        ATLTRACE("Error: %d", GetLastError());
        printf("Error: %d\n", GetLastError());
        return false;
    }
    //
    //rest of connection code here
    //
}

int SerialComm::CloseConnection() {
    return CloseHandle(info->handle);
}

InfoContainer::~InfoContainer() {
    delete handle;
}

我必须在主 class 中使用 InfoContainer class 和 InfoContainer 指针的原因是我需要存储的一些信息被认为是非托管代码,所以我不能直接在主要 class。

提前致谢!

问题是在删除所有对象之前调用了 _CrtDumpMemoryLeaks()

您需要一个终结器。以下是在 C++/CLI 中编写 class 时的 "golden pattern":

virtual ~SerialComm()
{
    this->!SerialComm();
}

!SerialComm()
{
}

不要忘记将 virtual 添加到析构函数。需要虚析构函数的原因应该在任何好的C++教科书中都有解释。