我看到在c++中有多种方法来分配和释放数据,我明白,当你调用malloc时你应该叫自由,当你使用新的操作符应与删除和对它是错误的把两个调用free()(例如,创建新的操作符),但是我不清楚我应该使用malloc / free,当我在现实世界中应该使用新的/删除程序。

如果你是c++专家,请告诉我你在这方面遵循的任何经验法则或惯例。


当前回答

只使用malloc和free来分配将由以c为中心的库和api管理的内存。对你控制的所有东西使用new和delete(以及[]变量)。

其他回答

很少考虑使用malloc/free而不是new/delete的情况是,当你使用realloc进行分配和重新分配(简单的pod类型,而不是对象)时,因为在c++中没有类似于realloc的函数(尽管这可以使用更c++的方法来完成)。

在c++中总是使用new。如果你需要一个无类型的内存块,你可以直接使用operator new:

void *p = operator new(size);
   ...
operator delete(p);

New vs malloc()

1) new是操作符,malloc()是函数。

2) new调用构造函数,而malloc()不调用。

3) new返回准确的数据类型,而malloc()返回void *。

4) new从不返回NULL(失败时会抛出),而malloc()返回NULL

5)重新分配内存不能由new处理,而malloc()可以

只使用malloc和free来分配将由以c为中心的库和api管理的内存。对你控制的所有东西使用new和delete(以及[]变量)。

如果你处理的数据不需要构造/销毁,需要重新分配(例如,一个大的整数数组),那么我相信malloc/free是一个很好的选择,因为它给你realloc,这比new-memcpy-delete快得多(它在我的Linux盒子上,但我猜这可能是平台相关的)。如果你使用的c++对象不是POD并且需要构造/销毁,那么你必须使用new和delete操作符。

无论如何,如果可以利用realloc可以给您的速度提升(如果您正在重新分配大型POD数组,有时是一个显著的提升),我不明白为什么不应该同时使用这两种方法(前提是您释放了错误的内存并删除了用new分配的对象)。

除非你需要它,否则你应该坚持在c++中使用new/delete。