我是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
当我执行代码时出现此错误
我不明白为什么,如果更改std :: vector的std :: list,代码执行得很完美......但我有一个std :: list
thnxs
答案 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