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++教科书中都有解释。
我正在创建一个串行通信库,它是一个托管程序集,它有自己的规则(我不完全理解它们,我只是在 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++教科书中都有解释。