スペースだけが必要な場合は、単純に 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;"
コンパイルの証明