c ++数组new char [] with boost :: shared_array?

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

这行代码是否有效:

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)

Kos*_*Kos 6

这是不正确的.有时,智能指针会尝试执行以下操作:

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时使用.