VS2017 DLL动态库使用教程【三】动态内存管理

dll的内存申请和释放问题--Debug程序正常而Release程序崩溃 C++编程中经常遇到这样的需求:主函数需要调用一个dll库函数并返回一块大小不定的存储着处理结果的内存,这时容易想到两种选择:一是使用vector的引用作为形参,二是使用指针,在主函数中定义指针,而在dll库函数中申请内存。 阅读详情

在dll内的malloc内存,必须在dll内free。否则就会出现问题。

比如:

DLL文件:

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

_declspec(dllexport) int* GetA(int size) //根据形参malloc出一个内存,并把它返回
{
	int *q = (int *)malloc(sizeof(int)*size); //这一行根据形参申请大小
	for (int i = 0; i < size; i++)  //这里根据形参依次赋值0,1,2,3,4........ 相信大家都看得的懂
	{
		q[i] = i;
	}
	return q;
}

DLLAPP文件(使用该dll的文件):

#include <iostream>
#include <Windows.h>
//声明库
#pragma comment(lib,"DLL_1.lib")
_declspec(dllexport) int* GetA(int size); //根据形参malloc出一个内存,并把它返回

int main()
{
	int *q = GetA(4); 
	for (int i = 0; i < 4; i++)
	{
		printf("%d\n", q[i]); //依次打印
	}
	free(q); //,这样释放是不可以的
	system("pause");
	return 0;
}

运行结果:

他运行到这里就已经卡住,并且无法关闭窗口,如果用之前的vs版本还可能弹出错报提示窗

 

正确的释放方式:

DLL文件

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

_declspec(dllexport) int* GetA(int size) //malloc出一个内存,并把它返回
{
	int *q = (int *)malloc(sizeof(int)*size);
	for (int i = 0; i < size; i++)
	{
		q[i] = i;
	}
	return q;
}
\\!!!!!!!!!!!!!!新加入的代码!!!!!!!!!!!!!
_declspec(dllexport) void freeA(int* i) //释放传入的指针
{
	free(i);
}
#include <iostream>
#include <Windows.h>
#include <mydll.h>
//声明库
#pragma comment(lib,"DLL_1.lib")
_declspec(dllexport) int* GetA(int size); //malloc出一个内存,并把它返回
_declspec(dllexport) void freeA(int *i);//释放

int main()
{
	int *q = GetA(4);
	for (int i = 0; i < 4; i++)
	{
		printf("%d\n", q[i]);
	}
	freeA(q); //使用DLL内释放函数
	system("pause");
	return 0;
}


没有任何错误,也没有卡住

 

 

 

注:new 和delete()也是一样,需要在dll内释放动态内存。

 

笔记中代码均保存到我的网盘下,链接:https://share.weiyun.com/5HMq3Cc

VS2017集成Crypto++库与AES-CBC加解密实战指南 对称加密是保障数据机密性的核心技术,其中AES(高级加密标准)作为当前全球最主流的算法,广泛应用于HTTPS、数据库加密及安全通信协议中。其原理基于分组密码,通过多轮替换和混淆操作对固定长度数据块进行处理,而CBC(密码块链接)等模式则解决了对长数据流的加密问题,通过引入初始化向量(IV)增强了安全性。在工程实践中,Crypto++库以其模块化设计和丰富的算法支持,成为C++开发者实现密码学功能的强大工具。本文将聚焦于在Visual Studio 2017开发环境中,从编译配置、项目集成到代码实现,详细讲解 阅读详情

相关推荐

告别配置烦恼:在Visual Studio 2019里为Fortran项目一键启用Intel MKL库

本文详细介绍了在Visual Studio 2019中为Fortran项目一键启用Intel MKL库的配置方法,帮助开发者快速解决版本兼容性、路径设置等常见问题。通过智能路径管理和验证程序,确保MKL库的正确使用,提升高性能计算开发效率。

weixin_26841743的博客 154

DLL动态库在vs里面的配置

在vs开发项目中很多时候都会有依赖其他DLL的场景,一般的配置方式有三种。 将.dll文件所在的路径加入系统环境变量中 直接将.dll文件放到调用它的文件的同级目录 在vs的项目属性中的 调试 ---->环境中写上:path=C:\mydllPath1;D:\mydllPath2; 不同的路径写在同一行,中间用分号隔开 示例 ...

qq_40622955的博客 1599

工业软件C++与Python融合架构实战:从设计到部署的完整指南

在工业软件与高性能计算领域,跨语言混合编程是解决性能与开发效率矛盾的关键技术。其核心原理在于利用不同编程语言的特长进行分工协作,例如C++负责底层高性能计算和实时控制,Python则专注于上层业务逻辑与快速原型开发。这种架构的技术价值在于,它能将C++的执行效率、系统级控制能力与Python的快速开发、丰富生态完美结合,从而构建出既稳定可靠又灵活易用的软件系统。在实际应用中,该技术广泛服务于工业自动化、CAD/CAE、机器视觉和物联网等场景,通过诸如pybind11等绑定工具实现无缝集成。本文以工业软件为背

ciya3282的博客 361

在DLL中用CRT静态库申请内存,EXE释放是不行的

因为malloc/free,new/delete都是调用HeapAlloc/HeapFree来实现来实现内存分配是释放的。查看Windows的API可以看到,这两个函数都需要一个Heap的HANDLE做为参数。CRT库采用了全局变量来保存这个HANDLE。如果是CRT静态链接,CRT库的代码会链接到各个DLL中去,也包括这个全局变量。也就是说,每个使用CRT静态链接的dll中都有一个自己的

Tommy(凌飞)的专栏 1949

Simulink模型保护实战:Protected Model、FMU与S-Function深度解析

在模型驱动开发与数字孪生领域,模型保护是确保知识产权和保障协作流程的关键技术。其核心原理是通过加密、编译或封装,将模型内部实现细节隐藏,仅暴露必要的输入输出接口,从而在交付、集成和联合仿真过程中防止核心算法与敏感参数被窥探或篡改。这项技术的核心价值在于平衡了知识共享与资产保护的需求,广泛应用于汽车电子、航空航天、工业控制等对算法保密性和模型可靠性要求极高的场景。具体到Simulink生态,工程师常面临如何安全交付模型给客户或供应商的挑战。为此,MathWorks提供了多种标准化方案,其中Protected

weixin_34248705的博客 380

【信息科学与工程学】【产品体系】第二十六篇 存储系统及存储服务器中所有学科知识01

存储系统是一门交叉学科,涉及计算机体系结构、分布式系统、编码理论、操作系统、网络等多个领域。编号类型学科/课程/产品存储系统领域的作用(含 AI infra / 存储网络 / 存储服务器 / 存储领域)核心知识点及数学建模/方程式/算法在存储系统中的作用及详细设计方法、时序、流程、模式代表教材/资料/论文 + 链接工业界应用001基础理论计算机体系结构、操作系统决定存储层级(寄存器-L1/L2/L3-内存-SSD-HDD-磁带),是 AI 训练集群、存储服务器、SAN/NAS 的物理底座存储层级模型:访问延

weixin_49199313的博客 49

【开发日记】调用方释放DLL中申请的内存

问题描述:C#调用C++的dll,传入一组数据,返回处理后的数据以及一些信息字段。但是,返回的内容是不定长的,也就是dll内部要进行动态内存申请。那么问题来了,C#怎么接收一个大小不确定的变量?使用完这些数据后,怎么在C#里面释放其内存? 前一个问题的危险是,该段内存的大小,调用方事先是未知的不能进行初始化,这可能会导致缓冲区溢出问题。目前的解决方法只能够是调用方预先分配一个足够大的内存

Kelvin_Yan的专栏 3900

Protocol Buffers v3.5.1 C++实战:从环境搭建到性能调优

在服务端开发中,序列化是网络通信与数据持久化的基石。相比手写字节流或XML/JSON文本格式,二进制序列化方案在性能、体积和跨平台兼容性上具有显著优势。Protocol Buffers通过.proto描述数据结构,生成各语言类代码,利用Varint编码与标签机制实现紧凑高效的二进制传输,并提供向前向后兼容能力。其C++库广泛应用于高吞吐后端服务、分布式存储及实时数据采集系统,支持Arena内存管理以降低动态分配开销,反射机制则便于构建通用协议转换工具。本文围绕protobuf v3.5.1在C++项目中的实

404

C++学习笔记-DLL中动态内存管理

动态内存管理 在dll中malloc的内存,必须在dll中free 注:这是由Windows自己的特点决定!   如果 a 编译成静态库,有下面两种解决方法: 1.b.dll 和 c.dll 使用同一个款编译器编译(保证CRT库版本一致),编译选项都选择 /MD(/MDD),这样不需 要担心内存是谁释放的问题了,因为他们底层使用的是同一个Heap,可以随便使用! 2.不要在 b.dll 中分配...

IT1995的博客 5446

uniapp 开发微信小程序请求问题 , 真机调试正常,开发工具正常,但是使用扫码预览接口都是不通的,发布到体验版也是请求失败

uniapp开发小程序体验版接口请求失败(真机可以)

weixin_60408555的博客 3954

Ollama最新快速上手指南:从安装到精通本地AI模型部署

想让Ollama跑你的"私房模型"?三种主流格式全支持,总有一款适合你!GGUF格式(推荐新手首选)创建Modelfile文件:执行创建命令:运行你的专属模型:PyTorch/Safetensors格式(适合进阶玩家)先用库测试模型能否正常加载确保模型结构完整后再导入Ollama官方文档有详细转换指南专业小贴士GGUF格式最轻量,PyTorch最灵活,Safetensors最安全遇到问题?试试用llama.cpp进行格式转换7B参数模型推荐使用q4_0量化级别想让AI用马里奥。

全世界的博客 2310

VC++集成ZLIB压缩库实战:从编译配置到调试排错完整指南

数据压缩是计算机科学中优化存储与传输效率的基础技术,其核心原理是通过算法消除数据冗余。在工程实践中,ZLIB作为广泛使用的开源压缩库,提供了稳定高效的DEFLATE算法实现。对于Windows平台的C++开发者而言,在Visual Studio环境中集成第三方库常面临编译配置、依赖管理等挑战。本文聚焦VC++项目集成ZLIB库的完整流程,涵盖从源码编译、运行时库配置到调试符号生成等关键环节。针对开发中常见的“NOTFOUND”链接错误和“VC++崩溃”问题,提供了具体的解决方案和排查路径。通过一个可运行的示

weixin_33711647的博客 423

UR5 机械臂手眼标定(Eye-in-Hand)实战:OpenCV 求解 AX=XB,误差 < 2mm

本文详细介绍了UR5机械臂在Eye-in-Hand配置下的手眼标定实战,通过OpenCV实现高精度标定,最终达到误差小于2mm的工业级精度要求。文章涵盖了标定基础原理、环境搭建、数据采集策略、核心算法实现及误差分析与优化,为视觉机械臂的自主抓取提供了实用指南。

weixin_31476015的博客 295

用实例证明dll中new的内存不能在exe中释放

VC中新建一个dll工程,设置使用“多线程调试DLL (/MDd)”。该dll导出以下alloc函数: [cpp] view plaincopy __declspec( dllexport )   int* alloc()   {      printf("in dll: %p\n", malloc);      return new int[1

liujiayu2的专栏 957

从AI画稿到3D虚拟时装:Illustrator与Substance 3D的服装设计工作流

本文旨在解决传统服装与纺织品设计师在产品开发流程中,面临的“2D印花图案无法直观预见3D上身效果”、“物理打样成本高昂且周期漫长”的核心痛点。我们将介绍一套纯数字化的3D可视化工作流,核心是利用 Adobe Illustrator 进行矢量印花图案创作,通过 Adobe Substance 3D Sampler 将其转化为逼真的PBR(基于物理渲染)布料材质,并最终在 Adobe Substance 3D Stager 中,将该材质应用于3D服装模型,渲染出照片级的虚拟样衣。本指南将帮助设计师以极低的成本和

Kingsdesigner的博客 1398

深度学习流体力学:基于PyTorch的物理信息神经网络(PINN)完整实现

本文介绍了基于物理信息神经网络(PINN)的深度学习流体力学求解器实现。首先阐述了Navier-Stokes方程的理论基础,包括连续性方程和动量守恒方程,并解释了PINN的核心原理:将物理方程作为约束条件嵌入神经网络损失函数。以经典的lid-driven cavity流动为例,详细展示了使用PyTorch实现的全流程,包括神经网络架构设计、自动微分求解Navier-Stokes方程、多约束条件优化训练等关键环节。该求解器通过将物理方程、边界条件和初始条件整合到损失函数中,实现了对流体力学问题的端到端求解,为

源代码杀手的博客 9841

DLL和exe里的malloc和free不能混用的问题

<br /> <br />今天老玉米提了一个问题问为什么dll里malloc的内存如果在exe里free的话会出错,我分析了一下C库的原代码,得出结论如下:<br /> <br />刚看了一下malloc和free 的源代码,在这两个函数中都有对全局变量的引用,而malloc和free是C库函数,分别被静态链接到exe和dll里,这样他们引用的全局变量也会有两份各是各的,自然不能混用。<br /><br />GlobalAlloc之类的windows API函数应该行。<br /><br /><br /><

ceabie的专栏 1029

LVGL v8学习笔记 | 09 - 进度条控件的使用方法(bar)

lv_bar_set_range必须放在lv_bar_set_mode前面,否则不生效。bar对象的API在lv_bar.h中声明,以lv_bar_xxx命名。此事件可以用来在进度条更新值之后更新别的控件(比如进度条旁边的文字)。可以看到,默认创建的进度条值是0到100。(3)设置进度条的范围值(最大值和最小值)(2)获取进度条的起始值。(3)获取进度条的最小值。(4)获取进度条的最大值。(1)设置进度条的当前值。(2)设置进度条的起始值。(1)获取进度条当前值。(5)获取进度条的模式。

Mculover666的博客(嵌入式) 1730

Windows内存管理

参考一: 1. 内存管理所要做的事 1)把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。 2)计算程序片段在主存中的物理位置,以便CPU调度。 2. 内存管理方式 1)块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪

人生代码,代码人生。。。 1128

华为OD机试真题 新系统2026-04-15 Python&JS 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 524

彻底解决JDK安装包点击后无反应

jdk双击无法安装,jdk双击没反应,jdk安装包双击后没反应。

renkai721的专栏 8939

DLL中申请内存及释放的机制。

DLL中用调用malloc申请的内存,会在DLL模块freelibrary的时候,由操作系统回收,自动失效,这点要注意,一般按谁申请谁释放的原则来进行内存的申请及回收。

nbabn的专栏 1596

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

《COM原理及应用》学习笔记之第三章

第三章 COM的实现1、COM的实现与操作系统平台密切相关因为COM最初源于Microsoft Windows平台,所以COM实现部分(即COM库)很多地方直接用到了Windows系统的一些特性,比如系统注册表、动态连接库等等,但实际上COM是一个与平台无关的组件软件模型。Windows上使用的COM标准只是COM的一个具体实现。 2、COM的实现方法进程内组件(DLL ,in

1004

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

关于什么时候使用CoTaskMemAlloc/CoTaskMemFree来申请/释放内存

<br />从网上看来的说法:<br />The thing is that COM (actually the RPC runtime library, but it's easier to blame COM) has an additional requirement for [out] pointers.  This requirement is that if the type of an [out] parameter isn't a scalar quantity (in other word

gaoxiaowei的专栏 3826

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

dll内申请的内存可以由调用它的程序释放吗?

  一般是哪里申请哪里释放,谁申请的内存由谁释放,这是封装的基本原则。     dll内部(对外隐藏)的内存分配,显然要dll自己处理啦。当然也可以由调用它的程序释放, 但不推荐,高内聚,且不安全       dll外部的由外部程序分配后传进dll,使用完后,可以由外部程序释放,也可以调用dll内部函数帮助释放。   如果导出的是类,则可以在类中定义自我是释放的Release导出函数:  

Mobidogs Blog 1830

如何使用VS2013将C++派生类封装成DLL并动态调用

如果源程序中C++的基类和由该基类生成的多个派生类在同一头文件和cpp文件下,要想将派生类编译成DLL使用,需要分别将每个派生类单独编译成DLL,再建立一个测试工程动态调用生成的DLL。

Blateyang的博客 4649
上一篇: VS2017 DLL动态库使用教程【二】DLL加载与卸载
下一篇: VS2017 DLL动态库使用教程【四】使用头文件
崔佳宇_
崔佳宇_ 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄10年 1万+粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值