如何安全地删除结构

时间:2013-10-24 13:28:01

标签: c++ pointers memory-management heap

我已经定义了这个结构:

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。如何安全地做到这一点。

5 个答案:

答案 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时没有分配(例如NULLSniffPacket或未初始化),那么您在演员阵容中调用未定义的行为,因此您之后执行的任何操作都是不相关的。

答案 4 :(得分:0)

取决于,

如果您使用分配了内存,则必须使用删除删除[] (如果是数组),如果您使用 malloc 功能分配了内存,则必须使用免费

此致