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。如果你真的需要未初始化的内存(你很少这样做),你可以使用operator new()and来分配/释放它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 回答
1

你可以做

void* data = new char[num_of_bytes];

以类似于 malloc 的方式分配一些内存

于 2020-01-25T09:45:21.430 回答