3

malloc を使用して、ヒープ上に 100 バイトのブロックを作成する関数オブジェクトを作成できます。

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

しかし、を使用して同等のものは何new char[]ですか? bind返される関数またはラムダにできることはわかっていますが、直接new char[100]バインドするための構文を理解したいと思いますnew char[]

それは可能ですか、それともnew char[]関数ではなく演算子であり、したがってバインドできませんか?

ありがとう、クレイグ

4

2 に答える 2

0

これはあなたが探しているものですか?

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

auto field = (char*)fn();
于 2013-05-15T16:56:47.663 に答える
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;"
}

これは一般的な場合と同じではないことに注意してください。これは、デストラクタnew T[]を構築したり、逆に::operator delete呼び出したりしないためです。ただし、char気にしないためです。

一部のコンパイラは、いかなる条件下でも関数ポインターのインライン化を拒否するため、ラムダを含む functionoid の方が適しています ( 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 に答える