GetAdapterAddresses函数,使用NEW代替MALLOC
GetAdapterAddresses function with NEW instead of MALLOC
我将使用windows的GetAdaptersAddresses()
函数来获取有关计算机适配器的一些信息。在这个MSDN页面有一个如何使用它的大例子。但我使用的是c++,所以我会坚持使用new
关键字,而不是malloc
(C原生)。如何用new
重写使用malloc
的部分?
编辑1
std::vector<PIP_ADAPTER_ADDRESSES> buffer;
ULONG outBufferLen = 0;
if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, &outBufferLen) == ERROR_BUFFER_OVERFLOW)
{
buffer.resize(outBufferLen);
PIP_ADAPTER_ADDRESSES addresses = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buffer.data());
if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, addresses, &outBufferLen) == NO_ERROR)
{
for (; addresses != NULL; addresses = addresses->Next)
{
...
}
}
}
编辑2
ULONG outBufferLen = 0;
if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, &outBufferLen) == ERROR_BUFFER_OVERFLOW)
{
PIP_ADAPTER_ADDRESSES p = new IP_ADAPTER_ADDRESSES[outBufferLen / sizeof(IP_ADAPTER_ADDRESSES)];
if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, p, &outBufferLen) == NO_ERROR)
{
....
}
}
您不能直接使用new
/delete
重写该代码,因为引入new
会引发异常风险,并且该代码不安全。一种愚蠢的方法是调用::operator new( size_t, const nothrow_t&)
而不是malloc()
-但这真的很难看。
真正的解决方案是使用合适的c++类重写所有代码。std::vector
将很适合pAddresses
,而lpMsgBuf
则需要RAII包装器。
相关文章:
- 如果没有malloc,链表实现将失败
- 我应该使用什么来代替void作为变体中的替代类型之一
- malloc() 可能出现内存泄漏
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 在C++中创建队列 - 什么是 malloc 错误?
- 如何在 malloc 内存中初始化非 POD 数据
- 使用 malloc() 时出现意外大小
- C++:在被本地字符串捕获后释放或销毁 malloc'd char *?
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 将 malloc 替换为数组
- 用' . '代替' :: '会在C++中造成歧义吗?
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- Malloc 在使用线程并行化 SSH 调用时存在问题
- 如何将新更改为 malloc?
- 将 malloc 转换为新的正确方法
- 使用什么代替"静态常量 TCHAR *"
- 我怎样才能代替使用新的使用malloc翻译
- 在C++中,"new/delete"在结构上代替"malloc/free"有多好?
- GetAdapterAddresses函数,使用NEW代替MALLOC