18
int main()
{
    void* Foo = new???
    delete Foo;
}

上記のようなことをどのようにしますか?置くことはできませんnew void[size]malloc()そして、 andでそれを行う方法を知りたくありませんfree()。私はすでにそれが機能することを知っています。私は興味があり、それが new と delete でどのように行われるか知りたいです。

私はこれをグーグルで検索し、何かを見ましたoperator new(size); そしてoperator delete(size);

newそれらと/の違いは何deleteですか? C++ が単に new を許可しないのはなぜvoid* [size]ですか?

4

5 に答える 5

35

これはトリックを行います:

int main()
{
    void* Foo = ::operator new(N);
    ::operator delete(Foo);
}

これらの演算子は、 と同様に、バイト単位で生メモリを割り当て/割り当て解除しますmalloc

于 2013-01-01T16:06:40.367 に答える
20

C++ が new void[size] を許可しないのはなぜですか?

voidはオブジェクトではないため、サイズはありません!どのくらいのスペースを割り当てる必要がありますか? new T[size]ほぼ同等であることに注意してmalloc(sizeof(T) * size)ください。

生のバイト配列だけが必要な場合は、char. *


* もちろん、これは C++ であるstd::vector<char>ため、メモリ リークや例外の安全性の問題を回避するために、次のようなものを使用する必要があります。

于 2013-01-01T16:05:13.610 に答える
12

C++ は、new T. またはnew T[n]いくつかのタイプのT。初期化されていないメモリが本当に必要な場合 (非常にまれです)、 and を使用して割り当て/割り当て解除できoperator new()ますoperator delete()

void* ptr = operator new(size);
operator delete(ptr);

(同様に配列形式の場合)

于 2013-01-01T16:10:02.790 に答える
2

void *任意のポインター型に変換可能です。単純に行うこともvoid *Foo = new int、必要な他のタイプを行うこともできます。しかし、これを C++ で行う理由はまったくありません。

于 2013-01-01T16:07:25.043 に答える