我可以创建一个函数对象来使用 malloc 在堆上创建一个 100 字节的块:
auto fn = std::bind(malloc, 100);
但是使用的等价物是什么new char[]
?我意识到我可以bind
返回一个函数或 lambda,new char[100]
但我想了解new char[]
直接绑定的语法。
是否有可能,或者是new char[]
一个运算符而不是一个函数,因此不能被绑定?
谢谢,克雷格
如果您只想要空间,那么您可以简单地 bind 是正确的::operator new
,但在一般情况下,new T[]
可以做更多。不幸的是,::operator new
它被重载了,所以编译器不知道你想要哪个,所以你必须“强制转换”它以获得正确的重载。tom1991t说 MSVC 在没有强制转换的情况下编译它,但我认为编译器不应该这样做。
#include <functional>
#include <new>
int main() {
typedef void*(*newptr_type)(std::size_t);
typedef void(*delptr_type)(void*);
auto al = std::bind<void*>(newptr_type(::operator new), sizeof(char)*100);
auto dl = delptr_type(::operator delete);
auto field = (char*)al();
dl(field); //or just "delete[] field;"
}
请注意,这与一般情况下的情况不同,因为 this不new T[]
构造也不会逆::operator delete
调用任何析构函数,但char
我们不在乎。
一些编译器在任何情况下都拒绝内联函数指针,所以一个 functionoid 会更好,包括一个 lambda(如rcapote所建议的)。该解决方案可以处理构造函数和析构函数,并且由于内联应该运行得更快。
auto al = [](){return new char[100];};
auto dl = [](char* p){delete[] p;};
auto field = (char*)al();
dl(field); //or just "delete[] field;"
这是你想要的?
auto fn = bind<void*>(operator new[], sizeof(char)*100);
auto field = (char*)fn();