将static_cast<字符 *>malloc/free/free转换为新的/删除
convert static_cast<char *>malloc/free to new/delete
因为发生了与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++提供了new
和delete
操作符,它们使用起来更加可靠。
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*>
不是类型
希望这对你有帮助
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 使用 free() 或删除时访问冲突
- 为什么我的节点在使用free()或删除时没有被删除
- 如何通过删除"free faces"从非流形中提取底层 2-流形?
- 我在C++中使用删除运算符时遇到问题。我在运行时不断收到"double free or corruption (fasttop)"错误
- 如何将'malloc'和'free'替换为'new'和"删除"?
- 如果使用malloc分配的内存是使用delete而不是free删除的
- 使用 malloc/free 来模拟新建/删除
- 删除 [] 导致 free() libc 错误
- 我在使用删除 [] 运算符时收到 free() 错误
- 将static_cast<字符 *>malloc/free/free转换为新的/删除
- 执行free()操作符从动态变量中删除地址
- 新的/malloc或删除/free占用或使缓存行无效
- 使用malloc和free来创建和删除对象?(实验)