GCC4.8对new和delete的参数匹配新要求

一段通信协议的代码,早年在GCC 4.4。VS2013下编译都挺好的,移植到GCC 4.8 ,为C++ 11做准备,在编译的时候发现问题

源代码省略后的版本如下:

class Zerg_App_Frame
{
public:

    //重载New函数
    static void   *operator new (size_t , size_t lenframe = LEN_OF_APPFRAME_HEAD);
    //不重载delte与情理不通,但是其实没有什么问题,
    static void operator delete(void *ptrframe,size_t);

public:

    //整个通讯包长度,留足空间,包括帧头的长度.
    uint32_t               frame_length_;

    //frame_appdata_ 是一个变长度的字符串序列标示,
#ifdef ZCE_OS_WINDOWS
#pragma warning ( disable : 4200)
#endif
    char                 frame_appdata_[];
#ifdef ZCE_OS_WINDOWS
#pragma warning ( default : 4200)
#endif

};

GCC(G++) 4.8编译提示的错误如下,

soar_zerg_frame.h:260:17: error: non-placement deallocation function ‘static void Zerg_App_Frame::operator delete(void*, size_t)’ [-fpermissive]
     static void operator delete(void *ptrframe,size_t);
                 ^
In file included from soar_svrd_app_fsm_notify.cpp:3:0:
soar_zerg_frame_malloc.h:323:86: error: selected for placement delete [-fpermissive]
         Zerg_App_Frame *proc_frame = new(size_appframe_[list_no] + 1) Zerg_App_Frame();

google了一下错误信息发现了一个比较清晰的解释。

http://stackoverflow.com/questions/5367674/what-does-the-error-non-placement-deallocation-function

可以翻译为GCC支持0x标准后,任务placement new有2个参数,对应的delete应该是2个参数,(第二个为size),非placement的new,对应的delete不能是2个参数。

而我的代码里面的new是new一个变长的数据,(这是一个协议头)所以不是placement的new,所以也就能有std::size_t参数。把代码改为:

    //重载New函数
    static void   *operator new (size_t , size_t lenframe = LEN_OF_APPFRAME_HEAD);
    //不重载delte与情理不通,但是其实没有什么问题,
    static void operator delete(void *ptrframe);

G++编译通过,OK,但回到VC++ 2013上编译,结果发现了如下告警:

2>soar_zerg_frame.cpp(395): warning C4291: ‘void *Zerg_App_Frame::operator new(size_t,size_t)‘ : no matching operator delete found; memory will not be freed if initialization throws an exception
2>          e:\courage\zcelib\zcelib.git\src\commlib\soarlib\soar_zerg_frame.h(339) : see declaration of ‘Zerg_App_Frame::operator new‘

看来VC++还没有跟上脚步。

又只有用ifdef写晦涩的兼容代码。TNNNNNNND。

时间: 2024-10-12 18:04:16

GCC4.8对new和delete的参数匹配新要求的相关文章

ios ASIHttpRequest库进行DELETE操作时delete带有参数表单的使用方法

1,普通的DELETE只需加上下述一句code: [request setRequestMethod:@"DELETE"]; 2,附带有参数表单的情况(一次删除请求): ASIFormDataRequest *request; NSURL *baseURL = [NSURL URLWithString:@"http://www.baidu.com/xx/"]; request = [ASIFormDataRequest requestWithURL:baseURL]

python函数的参数匹配

版本:一般用python2.7.6 python3.4.3会标注 1.不可变对象(整数.字符串)通过对象引用进行传递,在函数内部不可改变. 1 >>> def f(a): 2 ... a=100 3 ... 4 >>> b=88 5 >>> f(b) 6 >>> b 7 88 2.可变对象(列表.字典)也是通过对象引用进行传递,在函数内部可以改变.(原对象本地改变,但是重新赋值不会改变) 1 >>> def F(a)

【共读Primer】58.[6.5]参数匹配 Page217

一般来说函数的选择是比较明确的事情,因为有着参数类型和参数数量的标准. 但是如果将类型转换和默认参数都加入到重载函数中,这个过程就变的复杂起来. 来看看一下代码: void f(); void f(int); void f(int ,int); void f(double, double = 3.14); 在函数的选择过程中分为两步: 1. 找到当前作用域可见的所有名称相同的函数 2. 找到参数数量相等且类型相同或可转换的函数 f(5.6); // 调用 void f(double, doubl

vs2017,安装错误:找不到与以下参数匹配的产品

找不到与以下参数匹配的产品:channelId: VisualStudio.15.ReleaseproductId: Microsoft.VisualStudio.Product.Community 解决办法: 删除隐藏文件夹:C:\ProgramData\Microsoft\VisualStudio\Packages运行:C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\layout\InstallCl

MyBatis XML 映射器 select、insert update 和 delete、参数

MyBatis 的真正强大在于它的语句映射,这是它的魔力所在. 如果跟JDBC 代码进行对比,省掉了将近 95% 的代码. 1 selectCREATE TABLE person (id int(11) NOT NULL AUTO_INCREMENT,username varchar(100) DEFAULT NULL,password varchar(100) DEFAULT NULL,full_name varchar(100) DEFAULT NULL,first_name varchar

DELETE 请求参数保存在Body 中

NSMutableDictionary *parameter = [NSMutableDictionary dictionary];      NSString * url = [NSString stringWithFormat:signatureProxy,model2.scheduleId];    NSMutableURLRequest * req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];    r

关于mvc、webapi中get、post、put、delete的参数

webapi中post提交的数据必须是一个类,get提交的数量无所谓 多种参数get时,参数名不能相同: 在能通过c#的校验的前提下,参数名.参数数量不能全完相同 public string Get(int page, int pagesize) { return "test1"; } public string Get(int page) { return "test2"; } 这是没问题的 public string Get(int page, int page

new和delete为什么要匹配

operator new和operator delete函数有两个重载版本: 1 void* operator new (size_t); // allocate an object 2 void* operator new [] (size_t); // allocate an array 3 void operator delete (void*); // free an oject 4 void operator delete [] (void*); // free an array ne

关于函数的参数的新体会

函数的参数是一个局部变量,可以当成函数体最上方用var定义的一个局部变量.在进行js代码压缩的时候,该参数可以变成任意不冲突的标识符,如字母a或b.下面这个promise的例子里,resolve和reject其实可以随便换成别的标识符的. 变换前 var promise = new Promise(function(resolve, reject){ resolve("传递给then的值");});promise.then(function (value) { console.log(