C ++ placement new持续给出编译错误

时间:2016-07-25 22:31:26

标签: c++

尝试使用新的展示位置,但它一直给我错误。我记得不久前,它正在发挥作用。关于Ubuntu 14.04的g ++(ver 4.8.4)。

#include <stdio.h>
typedef unsigned int uint;
struct strSession {
    uint   sessionId;
    uint   srcIp;
    uint   dstIp;
};

int main(int argc, char *argv[]) {
    char buf[20];
    strSession *q = (strSession*)&buf[0]; 
    new (q) strSession;
    return 0;
}

收到错误

$ g++ -std=c++11 te.cc `pkg-config --cflags glib-2.0`
te.cc: In function ‘int main(int, char**)’:
te.cc:12:10: error: no matching function for call to ‘operator new(sizetype, strSession*&)’
  new (q) strSession;
          ^
te.cc:12:10: note: candidate is:
<built-in>:0:0: note: void* operator new(long unsigned int)
<built-in>:0:0: note:   candidate expects 1 argument, 2 provided

知道什么是错的吗?

2 个答案:

答案 0 :(得分:6)

要使用展示位置new,您需要:

#include <new>

此外,你可以很容易地使用:

int main(int argc, char *argv[]) {
    char buf[20];
    strSession *q = new (buf) strSession;
    return 0;
}

答案 1 :(得分:1)

要使原始代码生效,您需要添加

void* operator new( size_t, strSession * p ) { return p; }

在过去,在C ++离开贝尔实验室之前,C ++有一个功能 构造函数可以赋值给'this'。运营商新的位置 语法被认为是一种改进。