这个错挺奇怪: memory corruption

2017-12-19 16:25:06 +08:00
 tengtengking

用动态库会报 memory corruption 的错误,如果不用动态库直接编译运行就不会有这个错。 代码如下:

#include <queue>
#include <iostream>
#include "MTime.h"
using namespace std;
int main(void)
{
 	queue<int> a;
	TMTime *_MTime = NULL;
	_MTime = new TMTime;
	if (_MTime != NULL)
	{
		cout << "yes" << endl;
		int k = _MTime->MTimeInit();
		cout << k << endl;

	}
	int *k = new int;
	return 0;
}

其中,TMTime 是自己实现的类,内容非常简单。 另: 把代码中的 queue 换成 vector 或者 map 等都不会报错,替换三者的顺序也不会报错。 请大神给点启发。

2042 次点击
所在节点    C
7 条回复
exch4nge
2017-12-19 18:24:56 +08:00
只看这段代码应该没有什么特别的。如果楼主的动态库是分开编译的话,有可能因为是动态库编译时用的设置不一样。
zhouheyang0919
2017-12-19 19:26:56 +08:00
Undefined Behavior 的典型结果。
用 valgrind 之类的工具调试看看。
forestyuan
2017-12-19 21:39:38 +08:00
可能跟 TMTime 的实现有关
htfy96
2017-12-19 21:51:22 +08:00
虽然可能和 memory corruption 没啥关系,但是这代码质量不得不让人怀疑 TMTime 实现有 bug ……其次再怀疑动态库的一些坑
- C++ 不需要 main(void)中的 void 和最后的 return 0
- 单下划线+大写字母开头是保留的(_MTime )
- new 不会返回 null,而是抛异常 (当然如果你是 VC6/重载了 new 当我没说……)
tengtengking
2017-12-20 08:38:27 +08:00
fooofei
2018-02-23 22:22:06 +08:00
挺好奇的 能让我看看整个工程吗
tengtengking
2018-02-27 14:30:52 +08:00
@fooofei 抱歉不能给你看。 不过这个错误找到了,是因为编译和运行时用的不是同一个动态库文件。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/416026

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX