1

我已经定义了这个结构:

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在函数离开之前删除。如何安全地做到这一点。

4

5 回答 5

7

你没有!

你只有delete你自己new——这里没有new

于 2013-10-24T13:29:52.820 回答
4

您实际上所做的是告诉编译器将p_buffer指针值视为指向您的结构的指针,但这样做不会分配额外的内存。正在研究相同的记忆 - 只是有不同的解释。

如果您希望保留标题,您可以执行以下任一操作:

ETHER_HDR l_ethHeader = *(ETHER_HDR *)p_uffer;

这将在堆栈上分配一个标头结构,当它超出范围时将自动销毁。

或这个:

ETHER_HDR* l_ethHeader = new ETHER_HDR( *(ETHER_HDR *)p_uffer );

这将在堆上分配一个稍后需要删除的结构。

在其他条件相同的情况下,您应该选择选项 1,“始终支持堆栈”。

于 2013-10-24T13:45:25.427 回答
3

大多数编码风格指南建议分配内存的人也负责释放它。

你的释放取决于它是如何分配的——你的代码没有分配任何东西,所以我也不希望有任何释放,但是调用你的函数的函数可能需要释放。

如果它是使用 malloc 分配的——那么你只需释放它。

如果您的结构是使用“new”分配的,那么您必须使用“delete”并确保您的指针是相同类型或派生类型(继承),否则解构函数可能无法正确触发。

在你的情况下,结构是一个普通的旧数据类型,所以不可能说它是使用 malloc、new 还是堆栈变量分配的——后者根本不需要释放,因为返回会处理那个。

于 2013-10-24T13:47:38.503 回答
2

假设您p_buffer在输入时已经分配了您的SniffPacket,您不会在函数中取消分配它 - 因为您的函数似乎被设计为“嗅探”,而不是管理内存。

如果在您输入时它没有被分配(例如p_bufferNULL或未初始化)SniffPacket,那么您在您的演员阵容中调用未定义的行为,因此您之后所做的任何事情都是无关紧要的。

于 2013-10-24T13:44:47.443 回答
0

这取决于,

如果您使用new分配了内存,那么您必须使用deletedelete[](如果它是一个数组),如果您使用malloc函数分配了内存,那么您必须使用free

问候

于 2013-10-24T13:42:20.533 回答