热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Dll里用new申请的内存,以指针形式返回给主程序,可以这样用吗,怎么释放,何时释放?

Dll里用new申请的内存,以指针形式返回给主程序,可以这样用吗,怎么释放,何时释放?做了个小程序,我把dll里申请的mem在主程序里释放,总是出错,什么原因?能给点例子吗?
Dll里用 new 申请的内存,以指针形式返回给主程序,可以这样用吗,怎么释放,何时释放?

做了个小程序,我把dll里申请的mem在主程序里释放,总是出错,什么原因?能给点例子吗?

11 个解决方案

#1


Dll里用 new 申请的内存
还是 Dll里释放好。

#2


给出你错误的代码,看看

#3


只要返回的正确, 没问题的.

#4


建议使用HeapAlloc,然后配对HeapFree释放.

#5


代码大体是这样:

第一步:
把下面代码放到一个dll项目里,会生成一个dll,其中有一个函数叫“StrCatTest”
把这个dll名字也改成StrCatTest.dll,主程序要调用这个dll

typedef struct{
  long  ilDataType;
  union{
    bool    AsBool;       //布尔型
    char    AsChar;       //字符型变量
    int     AsInt;        //整数型变量
    double  AsDouble;     //双精度型变量
    char*   AsString;     //字符串型变量
  };
}CIValue;

extern "C" _declspec(dllexport) int __stdcall StrCatTest(CIValue* avArr,CIValue*avRtn){
  CIValue vv;
  AnsiString s;

  s = avArr[0].AsString;
  s += avArr[1].AsString;

  avRtn->AsString = new char[200]; //长度不是问题
  strcpy(avRtn->AsString,s.c_str());
  avRtn->ilDataType = 7;

  return 0;
}

第二步,随便建个项目,窗体上一个按钮,一个单行文本

加些代码,简写如下:

typedef struct{
  long  DataType;
  union{
    bool    AsBool;       //布尔型
    char    AsChar;       //字符型变量
    int     AsInt;        //整数型变量
    double  AsDouble;     //双精度型变量
    char*   AsString;     //字符串型变量
  };
}CIValue;

typedef int(*CIDllFunction)(CIValue*,CIValue*);

CIValue StrAppend(CIValue v1,char* ss){
  CIValue vv;
  AnsiString s;

  s = v1.AsString;
  s += ss;

  vv.DataType = 7; //string
  vv.AsString = new char[200]; //字符长度不必深究
  strcpy(vv.AsString,s.c_str());

  return vv;
}

//========按钮事件的代码如下:

void __fastcall TForm1::Button1Click(TObject *Sender) {
  int r;
  CIValue *v;
  CIValue v2;
  //**CIValue v3;
  FARPROC lpFarProc;
  HINSTANCE liDllHandle;//DLLa模块的句柄
  CIDllFunction lpFunc;

  v = new CIValue[2];
  v[0].DataType = 7;
  v[0].AsString = new char[20];
  strcpy(v[0].AsString,"ab");

  v[1].DataType = 7;
  v[1].AsString = new char[20];
  strcpy(v[1].AsString,"cd");

  liDllHandle = LoadLibrary("StrCatTest.DLL");//装载连接库, 得到该库句柄
  lpFarProc = GetProcAddress(liDllHandle,"StrCatTest"); //得到指向函数的指针
  lpFunc = (CIDllFunction)lpFarProc;

  lpFunc(v,&v2);
  delete[] v[0].AsString;  //执行了这句,DataType就变了
  delete[] v[1].AsString;

  FreeLibrary(liDllHandle);

  delete[] v;

  //**v3 = StrAppend(v2,"ef");
  //**Edit1->Text = v3.AsString;

  Edit1->Text = v2.AsString;
}


问题来了:

在执行了delete[] v[0].AsString;这行代码之后,v2的DataType就变了。而且在我的程序里,
执行形如StrAppend的函数时,跟踪进去,v1的DataType 也变,但简化程序后,我跟踪发现加了带//**的代码反倒完全正常了,搞不明白.

我不知道哪写错了,也不知道是不是申请内存的事,大家给看看,谢谢了先。

#6


建议在主程序建立对象,分配好内存,然后将对象指针传入DLL中。

#7


up

#8


偶在一个工程组里编译运行没有出现错误(最后加一句delete[]v2.AsString,使用了CG).
请楼主确定dll和exe的编译方式是否一样,字符对齐选项是否一致...

#9


肯定不行,dll申请的内存必须由dll负责释放,这是因为C运行库有两份的原因
建议楼主去看看windows核心编程

#10


因为DLL和EXE的使用的C++运行时刻库版本可能不一样,所以不建议使用这种做法
你可以使用COM的方法来让DLL执行清除内存的工作。

#11


谢谢大家,我试试

推荐阅读
  • JNI技术实践小结转自http:sett ... [详细]
  • 本文翻译自:WhatisaMavenartifact?什么是神器?为什么Maven需要它?#1楼参考:https:sta ... [详细]
  • 如何用js 实现依赖注入的思想,后端框架思想搬到前端来
    如何用js实现依赖注入的思想,后端框架思想搬到前端来-大家在做些页面的时候,很多都是用ajax实现的,在显示的时候有很多表单提交的add或者update操作,显然这样很烦,突然想到 ... [详细]
  • Ithinkthishasbeenupbefore,butcouldntfindanyanswertoit.Ifitsalreadyansweredplease ... [详细]
  • 这篇文章将为大家详细讲解有关C#开发技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。C#开发技 ... [详细]
  • PIMPL 是 C++ 中的一个编程技巧,意思为指向实现的指针。具体操作是把类的实现细节放到一个单独的类中,并用一个指针进行访问 ... [详细]
  • 最近自己做一个工具最后涉及到一个存储成bmp位图的形式,由于这部分并不是整个project的重点我就从网上找了例子改了改,但是目前的问题是有很多时候都是存储的bmp全黑,我也并不知道是怎么回事。 ... [详细]
  • 编程语言是从哪蹦出来的——大型伦理寻根现场
    Hello,我是Alex007,一个热爱计算机编程和硬件设计的小白,为啥是007呢?因为叫Alex的人太多了,再加上每天007的生活,Alex007就诞生了。聊一聊编程到底是啥,怎 ... [详细]
  • 在这一期的SendMessage函数应用中,我将向大家介绍如何利用消息函数来扩展树型列表(TreeView)控件的功能相信对于树型列表控件大家十分的熟悉, ... [详细]
  • 简单动态字符串redis里面很多地方都用到了字符串,我们知道redis是一个键值对存储的非关系型数据库,那么所有的key都是用字符串存储的,还有字符串类型,这些都是用字符串存储的 ... [详细]
  • 下面是一个用openssl实现获取https网页内容的demo,整个流程比较简单,主要封装的API如下staticinthttps_init(http ... [详细]
  • jdk安装与环境变量配置,看这一篇就够了
    文章目录场景jdk下载安装如何环境变量的配置总结场景在做java开发或者android开发,经常会碰到jdk安装与环境变量的配置,每次配置的时候,经常需要去查看一下,而且偶尔还会出 ... [详细]
  • 遇到的问题golang对于基本类型初始化的处理,是自动给基本类型赋值为默认值。比如:variint在这里如果不对i做任何赋值,那么i的值为零这个特性在很多地方能够避免访问到未初始化 ... [详细]
  • [二分图]JZOJ 4612 游戏
    DescriptionInputOutputSampleInput44#****#****#*xxx#SampleOutput5DataConstraint分析非常眼熟࿰ ... [详细]
  • 1、概念共享内存:共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同malloc()函数向不同进程返回了指向同一个 ... [详细]
author-avatar
专业STB
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有