c ++ list class vs2010 Ultimate

时间:2012-09-10 20:56:32

标签: c++ list class

我是C ++的新手(我正在使用Visual Studio 2010 Ultimate),我有一个问题是使用std :: list销毁一个类,我的代码是:

#include "p_list.h"

int main(){
    p_list uno;
    uno.~p_list();
    return 0;
}

并且类p_list是:

#pragma once
#ifndef LISTADO_H
#define LISTADO_H
#include <list>
using namespace std;
class p_list
{
public:
    list<int> first; 

    p_list(void);

    ~p_list(void);
};

#endif

当我执行代码时出现此错误

http://imageshack.us/photo/my-images/51/dibujopfw.jpg/

我不明白为什么,如果更改std :: vector的std :: list,代码执行得很完美......但我有一个std :: list

thnxs

3 个答案:

答案 0 :(得分:2)

该列表包含automatic storage,并将在范围出口处销毁:

#include "p_list.h"

int main(){
    p_list uno;
    return 0;
}  // destructor is called on scope exit

通过手动调用析构函数,您会激发两次销毁对象的尝试。

答案 1 :(得分:2)

你手动调用了析构函数,然后,当退出main()函数时,析构函数会再次被自动调用。

我们没有p_list.cpp;可以在那里删除两次吗?

答案 2 :(得分:0)

uno将在堆栈上分配。这也意味着当它超出范围时,其析构函数将被称为自动。您不需要(且不应该)手动调用它。

类中的成员变量也是如此。如果它们没有在堆上分配,那么当类的析构函数被调用时,它们的析构函数将被调用。

如果你在构造函数和析构函数中放置一个print语句,你可以自己看看:

#include "listado.h"
#include <iostream>
p_list::p_list(void)
{
    std::cout<<"plist constructor called\n";
}

p_list::~p_list(void)
{
    std::cout<<"plist destructor called\n";
}

接下来,删除对p_list的析构函数的任何手动调用,如juanchopanza建议的那样,并观察析构函数是否会被自动调用。

如果listado.cpp文件只包含构造函数和析构函数,请将其删除并使用:

#pragma once
#ifndef LISTADO_H
#define LISTADO_H
#include <list>
using namespace std;
class p_list
{
public:
    list<int> first; 

    p_list(void){};

    ~p_list(void){};
};

#endif