尝试使用新的展示位置,但它一直给我错误。我记得不久前,它正在发挥作用。关于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
知道什么是错的吗?
答案 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'。运营商新的位置 语法被认为是一种改进。