C++有多种分配和释放数据的方式。我知道使用malloc
时应该用free
来释放内存,而使用new
操作符时应该与delete
搭配使用。如果混合使用这两种方法(例如调用free()
释放由new
操作符创建的对象),那么将是一个错误。但是在实际编程中,我不清楚什么情况下应该使用malloc
/free
以及何时应该使用new
/delete
。
如果您是C++专家,请告诉我在这方面遵循的任何经验法则或惯例。
C++有多种分配和释放数据的方式。我知道使用malloc
时应该用free
来释放内存,而使用new
操作符时应该与delete
搭配使用。如果混合使用这两种方法(例如调用free()
释放由new
操作符创建的对象),那么将是一个错误。但是在实际编程中,我不清楚什么情况下应该使用malloc
/free
以及何时应该使用new
/delete
。
如果您是C++专家,请告诉我在这方面遵循的任何经验法则或惯例。
new
会初始化结构体的默认值,并正确地将其内部引用链接到自身。
例如:
struct test_s {
int some_strange_name = 1;
int &easy = some_strange_name;
}
因此,new struct test_s
将返回一个带有工作引用的初始化结构,而malloc的版本没有默认值,内部引用未初始化。
从较低的角度来看,new在提供内存之前会初始化所有内存,而malloc会保留内存的原始内容。
class B {
private:
B *ptr;
int x;
public:
B(int n) {
cout<<"B: ctr"<<endl;
//ptr = new B; //keep calling ctr, result is segmentation fault
ptr = (B *)malloc(sizeof(B));
x = n;
ptr->x = n + 10;
}
~B() {
//delete ptr;
free(ptr);
cout<<"B: dtr"<<endl;
}
};
我曾经接触过一些用于计算机图形学的C/C++应用程序。 经过这么长时间,有些东西已经消失了,我非常想念它们。
问题在于,malloc和new,free和delete都可以一起使用,尤其是对于某些基本类型而言,这是最常见的情况。
例如,char数组既可以用malloc分配,也可以用new分配。 主要的区别是,用new可以实例化一个固定大小的数组。
char* pWord = new char[5]; // allocation of char array of fixed size
在这种情况下,您不能使用变量作为数组的大小。 相反,malloc函数可以允许可变大小。
int size = 5;
char* pWord = (char*)malloc(size);
memset((void*)pWord, 0, sizeof(pWord) / sizeof(char));
分配函数适用于所有C包。因此,这些是通用函数,必须适用于更多的C类型。而C++库是旧的C库的扩展。因此,malloc函数返回一个通用的void*指针。结构体没有定义新的或删除操作符。在这种情况下,可以使用malloc分配自定义变量。
new和delete关键字实际上是一些定义好的C运算符。也许一个自定义的联合或类可以定义这些运算符。如果在一个类中没有定义new和delete,则可能无法正常工作。但是如果一个类派生自另一个具有这些运算符的类,则new和delete关键字可以具有基本类行为。
关于释放数组,free只能与malloc成对使用。不能使用malloc分配变量,然后使用delete释放。
简单的delete操作符只引用数组的第一个项目。因为pWord数组也可以写成:
pWord = &pWord[0]; // or *pWord = pWord[0];
当需要删除一个数组时,请使用delete[]运算符:
delete[] pWord;
free((void*)pWord);
new
和 delete
运算符可以用于类和结构体,而 malloc
和 free
只能用于需要转换的内存块。
使用 new/delete
将有助于改善您的代码,因为您不需要将分配的内存强制转换为所需的数据结构。
在C语言中,malloc()用于动态分配内存,而在C++中则使用new()完成相同的工作。 因此,您不能混合使用这两种语言的编码约定。 如果您想了解calloc和malloc()之间的区别,那就更好了。
malloc
。 - interjay