0

我是 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::list 更改为 std::vector,代码执行完美......但我需要一个 std::list

谢谢

4

3 回答 3

2

该列表具有自动存储功能,将在范围退出时被销毁:

#include "p_list.h"

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

通过手动调用析构函数,您将尝试两次销毁该对象。

于 2012-09-10T20:58:03.617 回答
2

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

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

于 2012-09-10T21:03:04.007 回答
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
于 2012-09-10T21:30:26.997 回答