我可以绑定到新的char []吗?

时间:2013-05-15 14:50:16

标签: c++ bind

我可以创建一个函数对象,使用malloc:

在堆上创建一个100字节的块
auto fn = std::bind(malloc, 100);

但使用new char[]的等价物是什么?我意识到我可以bind返回一个返回new char[100]的函数或lambda,但我想直接理解绑定到new char[]的语法。

它是否可能,或者new char[]是一个操作符而不是一个函数,因此无法绑定?

谢谢,克雷格

2 个答案:

答案 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

Proof of compilation