因为发生了与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];
答案 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
系列(malloc
,realloc
,calloc
,free
)几乎总是在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];
不是类型。
希望这会有所帮助:)