V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tengtengking
V2EX  ›  C

这个错挺奇怪: memory corruption

  •  
  •   tengtengking · 2017-12-19 16:25:06 +08:00 · 2078 次点击
    这是一个创建于 2560 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用动态库会报 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 等都不会报错,替换三者的顺序也不会报错。 请大神给点启发。

    7 条回复    2018-02-27 14:30:52 +08:00
    exch4nge
        1
    exch4nge  
       2017-12-19 18:24:56 +08:00
    只看这段代码应该没有什么特别的。如果楼主的动态库是分开编译的话,有可能因为是动态库编译时用的设置不一样。
    zhouheyang0919
        2
    zhouheyang0919  
       2017-12-19 19:26:56 +08:00
    Undefined Behavior 的典型结果。
    用 valgrind 之类的工具调试看看。
    forestyuan
        3
    forestyuan  
       2017-12-19 21:39:38 +08:00
    可能跟 TMTime 的实现有关
    htfy96
        4
    htfy96  
       2017-12-19 21:51:22 +08:00   ❤️ 1
    虽然可能和 memory corruption 没啥关系,但是这代码质量不得不让人怀疑 TMTime 实现有 bug ……其次再怀疑动态库的一些坑
    - C++ 不需要 main(void)中的 void 和最后的 return 0
    - 单下划线+大写字母开头是保留的(_MTime )
    - new 不会返回 null,而是抛异常 (当然如果你是 VC6/重载了 new 当我没说……)
    tengtengking
        5
    tengtengking  
    OP
       2017-12-20 08:38:27 +08:00
    fooofei
        6
    fooofei  
       2018-02-23 22:22:06 +08:00 via iPhone
    挺好奇的 能让我看看整个工程吗
    tengtengking
        7
    tengtengking  
    OP
       2018-02-27 14:30:52 +08:00
    @fooofei 抱歉不能给你看。 不过这个错误找到了,是因为编译和运行时用的不是同一个动态库文件。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   949 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:23 · PVG 03:23 · LAX 11:23 · JFK 14:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.