C++,MT运行库,同模块申请和释放内存,程序崩溃

jiushophy 2017-08-07 09:41:13
跨模块内存操作,按道理申请内存和释放内存,在同一个模块就不会出问题,我这个怎么有问题了。不多
说,直接上代码

//dll中某个类,_API为导出符号
class _API test1
{
public:
test1() { m_mem = NULL; }
~test1()
{
delete m_mem;
}

static test1* Create()
{
return new test1;
}
void Release()
{
delete this;
}
void startMemory()
{
m_mem = new int;
*m_mem = 1;
int iii = 0;
}
//成员变量
int *m_mem;
};

//另一个模块,直接调用模块一中类,申请内存,再释放,结果释放内存时蹦
test1 *t1 = test1::Create();
t1->startMemory();
t1->Release();

觉得很奇怪,new和delete都是在模块一中,为什么还出问题,我用的是MT的运行时库,MD的应该没问题

,哪位大神帮忙解释一下
...全文
487 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wh_ 2017-08-18
  • 打赏
  • 举报
回复
引用 13 楼 jiushophy 的回复:
创建和释放函数前都加virtual就行,参考这篇博客http://blog.csdn.net/zj510/article/details/35290505
他那种情况是两个模块中都有那个类的代码,比如一个类,有.h .cpp。然后他一个dll和一个exe中各有一份,从而两个模块中各自的代码。然后造成了创建与释放在不同的模块中实现。加virtual后可以通过虚函数表也实现在同一个模块中调用。 跟你的情况不太一样,你的是把整个类都导出了,然后导入整个类。这个类的代码只存在在dll中。不存在每个模块都有一份代码的情况。所以你的代码是没有问题的。除非你也是在exe中有一个类的实现的代码
jiushophy 2017-08-18
  • 打赏
  • 举报
回复
创建和释放函数前都加virtual就行,参考这篇博客http://blog.csdn.net/zj510/article/details/35290505
wh_ 2017-08-14
  • 打赏
  • 举报
回复
引用 10 楼 jiushophy 的回复:
[quote=引用 9 楼 wh_2396 的回复:] 是这样的,如果你用的是MD,你想在哪里申请,想在哪里释放都没有问题,但如果你用的是MT,就只能在模块内申请,在模块内释放。
我知道MD的可以随便在哪里申请和释放,可我用的是MT的,包装一层之后申请和释放内存应该都在第一个模块进行,可还是有问题。[/quote]反正我把你的代码复制下来运行了一次,什么问题都没有出来
jiushophy 2017-08-12
  • 打赏
  • 举报
回复
引用 5 楼 dong364 的回复:
第三方的dll的代码生成要设置一致,要么都是/md 要么都是/mt
这里没有涉及到第三方库
jiushophy 2017-08-12
  • 打赏
  • 举报
回复
引用 9 楼 wh_2396 的回复:
是这样的,如果你用的是MD,你想在哪里申请,想在哪里释放都没有问题,但如果你用的是MT,就只能在模块内申请,在模块内释放。
我知道MD的可以随便在哪里申请和释放,可我用的是MT的,包装一层之后申请和释放内存应该都在第一个模块进行,可还是有问题。
wh_ 2017-08-11
  • 打赏
  • 举报
回复
是这样的,如果你用的是MD,你想在哪里申请,想在哪里释放都没有问题,但如果你用的是MT,就只能在模块内申请,在模块内释放。
wh_ 2017-08-11
  • 打赏
  • 举报
回复
我亲自写了一遍,一点问题都没有?
赵4老师 2017-08-08
  • 打赏
  • 举报
回复
jena_wy 2017-08-08
  • 打赏
  • 举报
回复
代码看着没有问题,看是不是其他的问题。
赵4老师 2017-08-07
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
trytry1992 2017-08-07
  • 打赏
  • 举报
回复
delete this -> 调用析构 -> delete this -> .....
trytry1992 2017-08-07
  • 打赏
  • 举报
回复
。。。。 你这个delete this是什么意思
dong364 2017-08-07
  • 打赏
  • 举报
回复
第三方的dll的代码生成要设置一致,要么都是/md 要么都是/mt
jiushophy 2017-08-07
  • 打赏
  • 举报
回复

补充一下程序崩溃的提示

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧