1

将删除免费的字节数吗?

unique_ptr<sockaddr_in> up = make_unique<sockaddr_in>();        
// or unique_ptr<sockaddr_in> up( new sockaddr_in ); ???

/* 
    Some stuff 
    sockaddr and sockaddr_in are two different types of struct and are not relateted 
*/

sockaddr *p = reinterpret_cast<sockaddr *>( up.release() );

delete p; 
4

2 回答 2

4

在大多数情况下,sockaddr它不是sockaddr_in(source 1 , 2 , 3 ) 的基类:

struct sockaddr {
        ushort  sa_family;
        char    sa_data[14];
};

struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};

因此,根据[expr.delete]/p3程序的行为是未定义的:

...如果要删除的对象的静态类型与其动态类型不同,则静态类型应为要删除的对象的动态类型的基类,并且静态类型应具有虚拟析构函数或行为未定义。


话虽如此,在许多情况下,内置运算符delete只是简单地委托给free,它不需要大小,并且程序将按预期工作(尽管在 C++ 中编码时,我们真的更喜欢停留在定义行为的领域) .

为什么不简单地让其unique_ptr完成它的工作并deletesockaddr_in破坏时完成?

于 2021-06-07T10:29:28.897 回答
1

它将删除sizeof(sockaddr)bytes ,除非sockaddr是基本类型sockaddr_in并获得了虚拟析构函数。无论是否成功,都未定义。做完之后reinterpret_castsockaddr*就是指针的静态类型。问题是,它是否有不同的动态类型。

于 2021-06-07T10:29:32.457 回答