写了10几年C++,居然看不懂一个new语句。求大神帮解释

o_yale_o o_yale_o 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
ObPacket* spacket = new(session+1)ObPacket(); 这个new后面的()里是什么意思?在指针session+1上new?


注:这是阿里开源数据库oceanbase源代码,贴上相关源代码:(函数体内第10行)
    int ObClientManager::create_session(const ObServer& server,
const int32_t pcode, const int32_t version,
const int64_t timeout, const ObDataBuffer& in_buffer,
int64_t size, easy_session_t *& session) const
{
int ret = OB_SUCCESS;
easy_addr_t addr = convert_addr_from_server(&server);
session = easy_session_create(static_cast<int>(size));
if (NULL == session)
{
TBSYS_LOG(WARN, "create session failed");
ret = OB_LIBEASY_ERROR;
}
if (OB_SUCCESS == ret)
{
ObPacket* spacket = new(session+1)ObPacket();
//从线程局部中拿出该请求所对应的trace id
TraceId *trace_id = GET_TSI_MULT(TraceId, TSI_COMMON_PACKET_TRACE_ID_1);
if (NULL == trace_id)
{
ret = OB_ALLOCATE_MEMORY_FAILED;
TBSYS_LOG(ERROR, "no memory, alloc trace id failed, ret=%d", ret);
}
else
{
spacket->set_req_sign(ObPacket::tsi_req_sign());
ObPacket::tsi_req_sign() = 0;
/*
if (trace_id->is_invalid())
{
(trace_id->id).seq_ = atomic_inc(&(ObPacket::seq_generator_));
uint16_t *local_ip_suffix = GET_TSI_MULT(uint16_t, TSI_COMMON_IP_SUFFIX_1);
(trace_id->id).ip_ = *local_ip_suffix;
uint16_t *port = GET_TSI_MULT(uint16_t, TSI_COMMON_PORT_1);
(trace_id->id).port_ = *port;
}
*/
//else
//{
spacket->set_trace_id(trace_id->uval_);
//}
spacket->set_packet_code(pcode);
//为这个新的packet分配一个channel id
uint32_t new_chid = atomic_inc(&ObPacket::global_chid);
spacket->set_channel_id(new_chid);
spacket->set_api_version(version);
spacket->set_source_timeout(timeout);
spacket->set_data(in_buffer);
ObDataBuffer buffer(reinterpret_cast<char*>(spacket + 1), size - sizeof(ObPacket));
spacket->serialize(&buffer);
spacket->set_packet_buffer(buffer.get_data(), buffer.get_position());
spacket->get_inner_buffer()->get_position() = buffer.get_position();
session->status = EASY_CONNECT_SEND;//auto connect if there are no connection to addr
session->r.opacket = spacket;
session->addr = addr;
session->thread_ptr = handler_;
easy_session_set_timeout(session, static_cast<ev_tstamp>(timeout)/1000);
}
}
return ret;
}
...全文
评论 8
收藏 已收藏
分享
返回顶部
o_yale_o
C++ 语言 65,214 成员 250,514 内容