在void指针上使用new

时间:2013-01-01 16:03:40

标签: c++

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

你怎么做上面这样的事情?你不能放new void[size]。我不想知道如何使用malloc()free()来执行此操作。我已经知道这很有效。我很好奇,想知道如何使用new和delete。

我用Google搜索了一下,看到了operator new(size)的一些内容;和operator delete(size);

这些与new / delete之间有什么区别?为什么C ++不仅允许新的void* [size]

5 个答案:

答案 0 :(得分:27)

这样可以解决问题:

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

这些运算符分配/释放以字节为单位的原始内存,就像malloc一样。

答案 1 :(得分:18)

  

为什么C ++不仅允许新的void [size]?

因为void不是对象;它没有大小!应分配多少空间?请注意,new T[size] 大约等同于malloc(sizeof(T) * size)

如果您只想要一个原始字节数组,那么您可以使用char *

<小时/> *当然,虽然这是因为这是C ++,你应该使用像std::vector<char>之类的东西来避免内存泄漏和异常安全问题。

答案 2 :(得分:11)

C ++在使用new T的某些变体分配的构造对象中传播。某些类型new T[n]T。如果你真的需要未初始化的内存(这种情况非常罕见),你可以使用operator new()operator delete()来分配/取消分配它:

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

(类似于数组形式)

答案 3 :(得分:2)

void *可转换为任何指针类型。您可以简单地执行void *Foo = new int或任何其他类型的操作。但是在C ++中确实没有理由这样做。

答案 4 :(得分:1)

你可以做

void* data = new char[num_of_bytes];

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