败给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(
【面试】可以在子线程直接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
HardFault_Handler问题查找方法
STM32出现HardFault_Handler故障的原因主要有两个方面: 1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。 2、堆栈溢出。增加堆栈的大小。
详解C++ new-handler机制
当 operator new 不能满足一个内存分配请求时,它抛出一个 exception(异常)。很久以前,他返回一个 null pointer(空指针),而一些比较老的编译器还在这样做。你依然能达到以前的目的(在一定程度上),但是我要到本文的最后再讨论它。 在 operator new 因回应一个无法满足的内存请求而抛出一个 exception 之前,它先调用一个可以由客户指定的被称为 new-handler 的 error-handling function(错误处理函数)。(这并不完全确切,operator new 真正做的事情比这个稍微复杂一些,详细细节将在下一篇文章中讨论。)为
c语言中new_C++的new归纳详解
本文档为word文档,主要介绍c++中new的用法,介绍详细,有具体代码分析,适合初学者理解,高手也值得一看!


