败给new_handler了

mosal mosal 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
想定制个new_handler支持传参 代码如下:
#include <new>
#include <iostream>
#include <string>
using namespace std;
typedef void (*func)(string &);
void outOfmem(string &a)
{
cout << a << endl;
exit(-1);
}
template<typename FunT, typename Para>
struct pp
{
pp(FunT a, Para &b):pfunc(a), pstr(&b)
{
}
void operator() ()
{
pfunc(*pstr)
}
private:
FunT pfunc;
Para *pstr;

};
int main()
{
string a = "我们";
set_new_handler(pp<func, string>(outOfmem, a)());
char *p = new char[2147483647];

return 0;
}

编译器报错
operator.cpp(29) : error C2440: “<function-style-cast>”: 无法从“void”转换为
“std::new_handler”
void 类型的表达式不能转换为其他类型

std::new_handler 是函数指针类似如下定义
typedef void (*new_handler)()

请问应该怎么改,或者有什么其他办法?
...全文

相关推荐

C++ 内存分配处理函数set_new_handler的使用

一、函数的定义 函数在namespace std中有如下定义(C++98与C++11版本不一致): Typedef void (*new_handler)(); new_handler set_new_handler(new_handler new_p) throw(); //C++98 new_handler set_new_handler (new_handler new_p) noexcept; //C++11 二、函数介绍 该函数的作用是:当new操作或new[]操作失败时调用参数所指的new_p函数 异常安全: C++98、C++11分别在函数后面使用了throw(

weixin_38638312

【面试】可以在子线程直接new一个Handler吗?怎么做?

可以在子线程直接new一个Handler,不过需要在子线程里先调用Looper.prepare(),new一个Handler后,还需要调用Looper.loop()方法。 new Thread(new Runnable() { @Override public void run() { Looper.prepare(); new Handler(){ @Override public void

weixin_38634323

HardFault_Handler问题查找方法

STM32出现HardFault_Handler故障的原因主要有两个方面: 1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。 2、堆栈溢出。增加堆栈的大小。

weixin_38680957

详解C++ new-handler机制

当 operator new 不能满足一个内存分配请求时,它抛出一个 exception(异常)。很久以前,他返回一个 null pointer(空指针),而一些比较老的编译器还在这样做。你依然能达到以前的目的(在一定程度上),但是我要到本文的最后再讨论它。    在 operator new 因回应一个无法满足的内存请求而抛出一个 exception 之前,它先调用一个可以由客户指定的被称为 new-handler 的 error-handling function(错误处理函数)。(这并不完全确切,operator new 真正做的事情比这个稍微复杂一些,详细细节将在下一篇文章中讨论。)为

weixin_38630612

c语言中new_C++的new归纳详解

本文档为word文档,主要介绍c++中new的用法,介绍详细,有具体代码分析,适合初学者理解,高手也值得一看!

amchuan
评论 4
收藏 已收藏
分享
返回顶部
mosal
C++ 语言 65,214 成员 250,514 内容