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

o_yale_o 2017-02-21 09:47:16
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;
}
...全文
178 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
flying_music 2017-02-21
  • 打赏
  • 举报
回复
引用 7 楼 o_yale_o 的回复:
[quote=引用 2 楼 cyfcsd 的回复:] 定位new表达式,它不分配内存,而是在一个已经分配的内存空间中初始化一个对象
VC里的new支持这功能吗?[/quote]
#include <iostream>

using namespace std;

int main()
{
    int *p = (int*)malloc(sizeof(int));
    int *q = new(p)int(5);
    cout<<*q<<endl;
    free(p);
    p = NULL;
    system("pause");
    return 0;
}
o_yale_o 2017-02-21
  • 打赏
  • 举报
回复
引用 2 楼 cyfcsd 的回复:
定位new表达式,它不分配内存,而是在一个已经分配的内存空间中初始化一个对象
VC里的new支持这功能吗?
o_yale_o 2017-02-21
  • 打赏
  • 举报
回复
引用 2 楼 cyfcsd 的回复:
定位new表达式,它不分配内存,而是在一个已经分配的内存空间中初始化一个对象
还有这用法啊 受教了,非常感谢
fefe82 2017-02-21
  • 打赏
  • 举报
回复
引用 3 楼 o_yale_o 的回复:
编译环境是:centos 6.8 + GCC4.1.2 整个oceanbase项目都能编译通过了 但是我单独自己写个new(...) int;做测试。编译就不通过 很是奇怪
你可以贴一下你编不过的完整程序和编译命令、编译器输出
o_yale_o 2017-02-21
  • 打赏
  • 举报
回复
引用 1 楼 mLee79 的回复:
placement new, Ctrl + C Ctrl + V 十年么
正是正是 批评的是
o_yale_o 2017-02-21
  • 打赏
  • 举报
回复
编译环境是:centos 6.8 + GCC4.1.2 整个oceanbase项目都能编译通过了 但是我单独自己写个new(...) int;做测试。编译就不通过 很是奇怪
flying_music 2017-02-21
  • 打赏
  • 举报
回复
定位new表达式,它不分配内存,而是在一个已经分配的内存空间中初始化一个对象
mLee79 2017-02-21
  • 打赏
  • 举报
回复
placement new, Ctrl + C Ctrl + V 十年么

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧