我已经定义了这个结构:
typedef struct ethernet_header
{
UCHAR m_dest[6];
UCHAR m_source[6];
USHORT m_type;
} ETHER_HDR;
然后我在这样的函数中使用它:
void SniffPacket(u_char* p_buffer, int p_size)
{
//Ethernet header
ETHER_HDR *l_ethHeader = (ETHER_HDR *)p_uffer;
//Do Something
//How to safely delete l_ethHeader;
}
现在我想在函数离开之前删除l_ethHeader
。如何安全地做到这一点。
答案 0 :(得分:7)
你没有!
您delete
只有new
- 而且此处没有new
。
答案 1 :(得分:4)
你基本上已经完成的工作被告知编译器将p_buffer
指针值视为指向结构的指针,但这样做没有分配额外的内存。正在研究相同的记忆 - 只是有不同的解释。
如果你想保留标题,你可以这样做:
ETHER_HDR l_ethHeader = *(ETHER_HDR *)p_uffer;
会在堆栈上分配一个头部结构,当它超出范围时会自动销毁。
或者这个:
ETHER_HDR* l_ethHeader = new ETHER_HDR( *(ETHER_HDR *)p_uffer );
哪个会在堆上分配一个 以后需要删除的结构。
在所有其他条件相同的情况下,您应该选择选项1,“始终支持堆栈”。
答案 2 :(得分:3)
大多数编码风格指南都建议分配内存的人也负责解除分配。
你的交易取决取决于它的分配方式 - 你的代码没有分配任何东西,所以我不希望任何解除分配,但调用你的函数的函数可能需要解除分配。
如果是使用malloc分配的 - 那么你只需免费。
如果您的结构是使用“new”分配的,则必须使用“delete”并确保指针属于相同类型或派生类型(继承),否则解构器可能无法正确触发。
在你的情况下,struct是一个普通的数据类型,所以不可能说它是使用malloc,new分配还是如果它是一个堆栈变量 - 后者根本不需要重新分配作为返回会照顾好。
答案 3 :(得分:2)
假设您在输入p_buffer
时已经分配了SniffPacket
,则不会在函数中取消分配它 - 因为您的功能似乎是为了“嗅探”,而不是为了管理内存。
如果在您输入p_buffer
时没有分配(例如NULL
为SniffPacket
或未初始化),那么您在演员阵容中调用未定义的行为,因此您之后执行的任何操作都是不相关的。
答案 4 :(得分:0)
取决于,
如果您使用新分配了内存,则必须使用删除或删除[] (如果是数组),如果您使用 malloc 功能分配了内存,则必须使用免费。
此致