什么是 C 中 C++ 的新/删除等价物?
还是在 C/C++ 中是一样的?
C 中没有new
/delete
表达式。
如果您忽略构造函数/析构函数和类型安全,则最接近的等价物是malloc
andfree
函数。
#include <stdlib.h>
int* p = malloc(sizeof(*p)); // int* p = new int;
...
free(p); // delete p;
int* a = malloc(12*sizeof(*a)); // int* a = new int[12];
...
free(a); // delete[] a;
请注意,构造函数可能会在 C++ 中引发异常。相当于player* p = new player();
在 C 中是这样的。
struct player *p = malloc(sizeof *p);
if (!p) handle_out_of_memory();
int err = construct_player(p);
if (err)
{
free(p);
handle_constructor_error();
}
等价的delete p
更简单,因为析构函数永远不应该“抛出”。
destruct(p);
free(p);
在 C++ 中使用new
anddelete
结合了两个职责——分配/释放动态内存,以及初始化/释放对象。
正如所有其他答案所说,分配和释放动态内存的最常见方法是调用malloc
and free
。您还可以使用特定于操作系统的函数来获取大量内存并在其中分配对象,但这很少见 - 仅当您有 malloc 不满足的相当特定的要求时。
在 C 语言中,大多数 API 将提供一对函数来完成 和 的其他new
角色delete
。
例如,文件 api 使用了一对打开和关闭函数:
// C++
fstream* fp = new fstream("c:\\test.txt", "r");
delete fp;
// C
FILE *fp=fopen("c:\\test.txt", "r");
fclose(fp);
可能是fopen
用于malloc
为FILE
结构分配存储空间,或者它可能会在进程启动时为最大文件指针数静态分配一个表。关键是,API 不需要客户端使用malloc
和free
.
其他 API 提供的函数仅执行合约的初始化和释放部分 - 相当于构造函数和析构函数,允许客户端代码使用自动、静态或动态存储。一个例子是 pthreads API:
pthread_t thread;
pthread_create( &thread, NULL, thread_function, (void*) param);
这允许客户端更大的灵活性,但增加了库和客户端之间的耦合 - 客户端需要知道pthread_t
类型的大小,而如果库处理分配和初始化,则客户端不需要知道类型的大小,因此实现可以在完全不改变客户端的情况下发生变化。两者都没有像 C++ 那样在客户端和实现之间引入如此多的耦合。(将 C++ 视为具有 vtables 的模板元编程语言通常比 OO 语言更好)
不是直接的精确副本,但兼容的等价物是 malloc 和免费的。
<data-type>* variable = (<data-type> *) malloc(memory-size);
free(variable);
没有构造函数/析构函数——C 无论如何都没有它们 :)
要获取内存大小,您可以使用sizeof
运算符。
如果你想使用多维数组,你需要多次使用它(就像新的一样):
int** ptr_to_ptr = (int **) malloc(12 * sizeof(int *)); //assuming an array with length 12.
ptr[0] = (int *) malloc(10 * sizeof(int)); //1st element is an array of 10 items
ptr[1] = (int *) malloc(5 * sizeof(int)); //2nd element an array of 5 elements etc
使用 malloc / free 函数。
晚了,但我真的很喜欢这种语法,虽然我不确定它是否适合 C 的方式
#include <stdlib.h>
#define new(type, length) malloc(sizeof(type)*(length))
#define delete(x) free(x)
int main()
{
int *test = new(int, 30);
delete(test);
}