3

我可以创建一个函数对象来使用 malloc 在堆上创建一个 100 字节的块:

auto fn = std::bind(malloc, 100);

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

是否有可能,或者是new char[]一个运算符而不是一个函数,因此不能被绑定?

谢谢,克雷格

4

2 回答 2

0

如果您只想要空间,那么您可以简单地 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;"
}

请注意,这与一般情况下的情况不同,因为 thisnew 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;"

编译证明

于 2013-05-15T18:21:56.257 回答
0

这是你想要的?

auto fn = bind<void*>(operator new[], sizeof(char)*100);

auto field = (char*)fn();
于 2013-05-15T16:56:47.663 回答