realloc、malloc、new 时进程直接退出的原因

在使用realloc、malloc、new时遇到进程直接退出的问题。通过调试发现,问题源于调用realloc时,进程在_heap_alloc中退出,原因是缺少CRT库链接,可能是自定义入口点或其他因素导致的。解决方法是确保正确链接CRT库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

     调试代码时发现在调用一个开源库时进程直接退出了,跟踪发现在调用到 realloc 时退出的,之前没碰到过

     笫一想法是参数有问题,跟进

   


发现参数正常



继续,pBlock = NULL,进入_malloc_base,发现在_heap_alloc时进程退出,继续跟进_heap_alloc



进入这里发现 _crtheap 为了,然后__crtExitProcess直接退出进程,


原来是我设置了入口点,ctr库没链接进来,不能调用crt函数

<span style="font-size:18px;">#pragma comment(linker, "/ENTRY:mymain")



</span>

结论:

    检查是不是由于设置了自定义入口或者其他原因而没有链接CRT库



### C++ 中 `malloc`、`realloc` 和 `new` 的区别及使用方法 #### 动态内存分配概述 动态内存分配允许程序在运行请求额外的存储空间。C++ 支持多种方式来实现这一点,其中最常用的是通过标准库函数 `malloc`/`realloc` 以及运算符 `new`。 #### 函数声明与头文件引入 为了使用这些功能,在源代码顶部需包含相应的头文件: 对于 C 风格的内存管理操作 (`malloc`, `realloc`) ,应加入 `<cstdlib>` 或者更传统的 `<stdlib.h>` 。而针对面向对象特性的 `new` 运算符,则不需要显式导入任何特定头部单元,因为这是内置支持的一部分[^2]。 #### Malloc 使用说明 `malloc()` 是用于从堆上分配指定字节数量未初始化的空间,并返回指向该区域起始位置的一个通用指针(即 `void*`)。由于其不执行构造函数调用,因此仅适用于基本数据类型的简单数组创建场景。需要注意的是,当不再需要这块资源务必记得调用 `free()` 来回收它所占用的位置,防止发生泄漏问题[^1]。 ```cpp // 假设要为整数数组预留足够的容量 int n = 5; int *array = static_cast<int*>(malloc(n * sizeof(int))); if (!array) { // 错误处理... } for (int i = 0; i < n; ++i){ array[i]=i*i; } free(array); ``` #### Realloc 使用说明 如果先前已经利用 `malloc()` 获取了一片连续地址区间但后来发现不够用了怎么办?这就可以借助于 `realloc()` 实现原地扩展或收缩的目的——传入旧有缓冲区首址加上新的期望大小作为参数即可完成调整动作;当然也有可能因种种原因无法满足需求从而返回 NULL 指向新分配出来的更大范围内的另一处空白地带供后续迁移过去继续沿用下去。 ```cpp // 尝试增加原有数组长度至两倍 n *= 2; array = static_cast<int*>(realloc(array, n * sizeof(int))); if (!array) { // 错误处理... } else { for (; old_n < n; ++old_n){ array[old_n]=(old_n-old_n%3)*7+9; } } ``` #### New 使用说明 不同于上述两者基于过程式的编程范式设计思路,现代 C++ 更推崇采用类成员形式的新建实例语法糖衣包裹下的底层机制运作原理:每当遇到像 T obj[] 这样的表达式编译器便会自动帮我们合成一段隐含着适当规模申请逻辑在内的机器码片段并负责安排好一切必要的准备工作直至最终能够顺利产出预期的对象实体出来为止。更重要的一点在于每当我们运用此关键字构建复合结构体的候还会顺带触发关联模板定义里预置好的默认构造子例程去填充各个字段初始状态值确保不会残留不确定因素影响正常使用体验。 ```cpp class MyClass {}; MyClass* pInstance = new MyClass(); // 单个对象 delete pInstance; pInstance = new MyClass[10]; // 数组版本 delete [] pInstance; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值