将static_cast<字符 *>malloc/free/free转换为新的/删除

convert static_cast<char *>malloc/free to new/delete

本文关键字:free 删除 转换 malloc static cast lt 字符 gt      更新时间:2023-10-16

因为发生了与malloc/free相关的分割错误,我想将malloc/free转换为new/delete。malloc/free转换为以下格式时发生错误。让我知道如何解决它。

(原始)

char *only_valid_data = static_cast<char*> (malloc (data_size));

(转换)

char *only_valid_data = new static_cast<char*> [data_size];

只管做

char* only_valid_data = new char[data_size];

分配。

让你自由

delete[] only_valid_data;

重要提示:当你用new分配内存时,它将分配data_size 元素,而不是data_size字节(像malloc那样)。元素的大小是非指针基类型的大小,在你的例子中,例如sizeof(*only_valid_data)。在这种情况下,元素大小和字节大小是相同的(因为sizeof(char)总是被指定为1),但如果基类型是其他类型,则会产生很大的差异。

例如,如果您执行

int* int_ptr = new int[10];

则会分配十个整数,而不是十个字节。这相当于

int* int_ptr = reinterpret_cast<int*>(malloc(10 * sizeof(*int_ptr)));

还要注意,对于复杂类型,如结构和类,使用new(或new[])分配不仅仅是分配内存,它还将确保调用分配的对象构造函数。malloc函数只分配内存,它不调用构造函数。


最后注意:无论您如何分配内存,您所遇到的分段错误问题可能不是由您的分配引起的。问题更有可能是由于其他原因,您没有在问题中显示的原因,例如编写超出分配内存的范围或解引用空指针。

你需要在调试器中运行你的程序来捕捉崩溃的动作,它将允许你检查函数调用堆栈,如果崩溃没有发生在你的代码中,那么你沿着调用堆栈一直走到你的代码。在这里,您可以检查变量的值,以帮助您理解问题发生的原因。

malloc家族(malloc, realloc, calloc, free)几乎总是在C代码中使用,因为c++提供了newdelete操作符,它们使用起来更加可靠。

malloc分配的一个问题是,您必须以字节为单位指定要分配的类型的大小。例如:

int* ptr = malloc(5);

将不为5个整数分配内存空间;它将分配5个字节的内存(整数的大小是4个字节,所以这显然会在分配时引起问题)。

必须写成

int* ptr = malloc(5 * sizeof(int));

这样就分配了20个字节。

然而,也有一些例外。例如,char只需要一个字节的内存,所以执行

char* ptr = malloc(5);

将分配足够的内存来容纳5个字符,并且在某种程度上比写

更有效:
char* ptr = malloc(5 * sizeof(char)); //5 * sizeof(char) == 5 * 1 == 5

然而,free函数不需要知道要释放的指针的大小;只需要一个void*


注意,在c++中,必须将malloc的返回值正确地转换为所需的类型;malloc返回void*类型,但c++不允许任何指针像C那样将void*赋值给任何指针类型:

int* ptr = malloc(5 * sizeof(int)); //valid C code, invalid C++
int* ptr2 = (int*)malloc(5 * sizeof(int)); //valid C code, valid C++

在c++中,new[]运算符解决了忘记添加sizeof运算符的问题。

int* ptr = new int[5];//allocates 5 integers
int* ptr2 = new int(5);//be careful: this allocates a single integer with value of 5

注意,如果使用了new[]操作符,则必须使用delete[]操作符。否则必须使用delete操作符:

int* ptr = new int[5];//allocates 5 integers
delete[] ptr;//deallocate the 5 integers
int* ptr2 = new int(5);//be careful: this allocates a single integer with value of 5
delete ptr;//deallocate the integer

你的代码的问题是它不适合new[]操作符的语法

语法可以描述为:
T* p = new T[size];

因此你的代码:

char *only_valid_data = new static_cast<char*> [data_size];

应该更正为:

char *only_valid_data = new char[data_size];

因为static_cast<char*>不是类型

希望这对你有帮助