将static_cast <char * =“”> malloc / free转换为new / delete

时间:2015-08-24 11:42:17

标签: c++ malloc static-cast

因为发生了与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];

2 个答案:

答案 0 :(得分:6)

只做

char* only_valid_data = new char[data_size];

分配。

让你自由

delete[] only_valid_data;

重要提示:当您使用new分配内存时,它将分配data_size 元素 ,而不是data_size字节(如{ {1}}确实)。元素的大小是非指针基类型的大小,在您的情况下,例如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)分配不仅仅是分配内存,还会确保分配的对象(s)构造函数叫做。 new[]函数只分配内存,它不会调用构造函数。

最后注意事项:无论您如何分配内存,分段故障所带来的问题可能不是由您的分配引起的。问题更可能是因为其他东西,你没有在你的问题中显示,比如写出已分配内存的边界或取消引用空指针。

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

答案 1 :(得分:3)

由于C ++提供{{1},malloc系列(mallocrealloccallocfree)几乎总是在C代码中使用}}和new运算符使用起来更加可靠。

分配delete的问题是您必须指定要分配的字节大小(以字节为单位)。例如:

malloc

不会为内存中的5个整数分配空间;它将分配5个字节的内存(整数的大小为4个字节,因此在分配时这显然会导致问题。)

要做得好,必须写成

int* ptr = malloc(5);

这样就分配了20个字节。

但是,案件有一些例外。 int* ptr = malloc(5 * sizeof(int)); ,例如只需要一个字节的内存,所以

char

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

char* ptr = malloc(5);

但是,char* ptr = malloc(5 * sizeof(char)); //5 * sizeof(char) == 5 * 1 == 5 函数不需要知道要释放的指针的大小;只需要free

请注意,在C ++中,void*的返回必须正确地转换为所需的类型; malloc返回malloc类型,但C ++不允许任何指针将void*分配给任何指针类型,如C:

void*

在C ++中,int* ptr = malloc(5 * sizeof(int)); //valid C code, invalid C++ int* ptr2 = (int*)malloc(5 * sizeof(int)); //valid C code, valid 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]; 不是类型。

希望这会有所帮助:)