none
标准库的问题(百思不得其解呀) RRS feed

  • 问题

  • 大致代码是这样的:

    #include "stdafx.h"
    #include <vector>
    #include <list>

    using namespace std;
    class Job{
    public:
    int nCpu,nMemory;
    //...
    };

    class example{
    public:
    list<int> TaskList;
    vector<Job> in;
    example(vector<Job>& input){
    in = input;
    //...
    }
    ~example(){
    TaskList.~list();
       in.~vector();
    }
    };

    int main(){
    vector<Job> input;
    example instance(input);

    }

    说明:调试发现错误出现在list<>::clear()函数中,尝试修改example类中的析构函数,还是不能得到正确的结果。哭~

    求解决方法,谢谢。

    2014年10月18日 8:17

全部回复

  • 你好:

          =>"调试发现错误出现在list<>::clear()函数中,尝试修改example类中的析构函数,还是不能得到正确的结果"

          请问能贴一下你得到了什么错误信息吗,并且得到了什么样的结果? 或许你能提供完整的例子让我在这边能够帮你调试。从你贴出来的代码很难看出来你的问题除了你的example类的析构函数看不懂以外。您是怎么使用clear()函数的,我们在不知道错误的信息很难找出问题的所在。

    Shu Hu


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.



    • 已编辑 Shu 2017 2014年10月20日 7:27
    2014年10月20日 6:55
  • 现在主要的问题是:在自定义的类中添加list成元后,不能显式构析。

    错误的描述:test1.exe 中的 0x0134258c 处有未经处理的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突

    相关代码:

    #include "stdafx.h"
    #include <list>
    
    using namespace std;
    
    class example{
    public:
    	list<int> data;
    public:
    	example(){
    		data.push_back(1);
    	}
    	
    
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	example test;
    	
    	test.~example();
    	return 0;
    }
    
    不显式调用析构函数不会出现问题,但是显式析构时会出现错误!!

    • 已标记为答案 Shu 2017 2014年10月20日 9:48
    • 取消答案标记 Shu 2017 2014年10月20日 9:48
    2014年10月20日 7:53
  • 你好:

         从你上面的例子来看,我认为应该是重复析构导致程序报错。系统会自动隐式调用析构栈上的内存,而用户自己显式调用析构函数是释放堆上的内存,当你显示调用析构函数的时候,析构函数就如同类的成员函数一样。如果你push_back的是一个指针的话,那么你就要自己写析构。我在你的例子添加一点语句来证实这一点:

    #include "stdafx.h"
    #include "iostream"
    #include <list>
    
    using namespace std;
    
    class example{
    public:
    	list<int> data;
    public:
    	example(){
    		data.push_back(1);
    	}
    	~example(){cout<<"xi gou"<<endl;}
    
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	example test;
    	
    	test.~example();
    	return 0;
    }

    Ctrl+F5 运行程序结构:

    说明系统自动调用了一次析构函数,建议你了解一下显示析构,什么时候用等等。类似这样的blog:http://www.cppblog.com/lf426/archive/2008/04/12/46909.html


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    • 已编辑 Shu 2017 2014年10月20日 10:37
    2014年10月20日 10:04
  • 首先

    in = input;

    这一句应该是编译不过去的,因为std::vector<>不允许复制的。

    ~example(){
    TaskList.~list();
       in.~vector();
    }
    这个在析构函数中,调用了成员变量的析构函数,导致析构了两边。可能std::list::~list里调用了clear函数,所以第二次析构的时候clear函数里出错了。


    2014年10月26日 4:41