代码之家  ›  专栏  ›  技术社区  ›  Marco Simone

Visual C++内存泄漏

  •  -1
  • Marco Simone  · 技术社区  · 7 年前

    这是我得到的泄漏警告(第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.
    

    这是lib的.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);
    };
    

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

    我必须在主类中使用InfoContainer类和InfoContainer指针的原因是,我需要存储的一些信息被视为非托管代码,因此我不能将其直接放在主类中。

    提前感谢!

    1 回复  |  直到 7 年前
        1
  •  0
  •   JazzSoft    7 年前

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

    终结器 .以下是在C++/CLI中编写类时的“黄金模式”:

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

    事实上的 给你的毁灭者。任何好的C++教科书都应该解释为什么需要虚拟析构函数。