uni*_*n83 -1 c++ arrays malloc shared-ptr new-operator
这行代码是否有效:
boost::shared_array<struct sockaddr> addr(
reinterpret_cast<struct sockaddr *>(
(ipv6 ? new unsigned char [sizeof(struct sockaddr_in6)]
: new unsigned char [sizeof(struct sockaddr_in)])
)
);
Run Code Online (Sandbox Code Playgroud)
请注意分配和类型中给出的类型之间的两种不同数据类型<template>.
这行代码是否有效:
boost::shared_ptr<struct sockaddr> addr(
reinterpret_cast<struct sockaddr *>(
(ipv6 ? new unsigned char [sizeof(struct sockaddr_in6)]
: new unsigned char [sizeof(struct sockaddr_in)])
)
);
Run Code Online (Sandbox Code Playgroud)
请注意分配和类型中给出的类型之间的两种不同数据类型<template>.
boost::shared_array<unsigned char> address(new unsigned char [sizeof(sockaddr_in)]);
Run Code Online (Sandbox Code Playgroud)
注意:使用相同类型的unsigned char,其大小恰好是所需的大小.
然后当我打算使用它时:
bind(, (sockaddr*)address.get(), );
Run Code Online (Sandbox Code Playgroud)
这是不正确的.有时,智能指针会尝试执行以下操作:
sockaddr* data;
// ...
delete data; // boom!
Run Code Online (Sandbox Code Playgroud)
你的缓冲区需要以另一种方式删除(delete[]没有delete和通过正确类型的指针).
看看boost::shared_array,也许这就是你真正需要的.
在您的编辑和评论之后
一种类型安全的解决方案是使用:
typedef boost::shared_ptr<
boost::variant<sockaddr_in,
sockaddr_in6>
> sharedSockaddr;
// helper function for interaction with C
sockaddr* getSockaddr(sharedSockaddr addr) {
struct printer : boost::static_visitor<>
{
sockaddr* out;
void operator()(const sockaddr_in& t)
{
out = reinterpret_cast<sockaddr*>(&t);
}
void operator()(const sockaddr_in6& t)
{
out = reinterpret_cast<sockaddr*>(&t);
}
};
printer p;
boost::apply_visitor(p, *addr);
return p.out;
}
Run Code Online (Sandbox Code Playgroud)
sharedSockaddr在代码中使用s,并getSockaddr在需要获取sockaddr*传递给C API时使用.
| 归档时间: |
|
| 查看次数: |
1379 次 |
| 最近记录: |