我可以创建一个函数对象,使用malloc:
在堆上创建一个100字节的块auto fn = std::bind(malloc, 100);
但使用new char[]
的等价物是什么?我意识到我可以bind
返回一个返回new char[100]
的函数或lambda,但我想直接理解绑定到new char[]
的语法。
它是否可能,或者new char[]
是一个操作符而不是一个函数,因此无法绑定?
谢谢,克雷格
答案 0 :(得分:0)
这是你在找什么?
auto fn = bind<void*>(operator new[], sizeof(char)*100);
auto field = (char*)fn();
答案 1 :(得分:0)
如果您只想要空间,那么您可以简单地绑定::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;"
}
请注意,在一般情况下,不与new T[]
相同,因为这不会构造,反向::operator delete
也不会调用任何析构函数,但对于{ {1}}我们不在乎。
有些编译器在任何条件下都拒绝内联函数指针,因此函数体会更好,包括lambda(由rcapote建议)。这个解决方案可以处理构造函数和析构函数,并且由于内联而应该运行得更快。
char