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::ベクトルのstd::listを変更すると、コードは完全に実行されます...しかし、std::listが必要です

thnxs

4

3 に答える 3

2

デストラクタを手動で呼び出した後、main()関数を終了すると、デストラクタがもう一度自動的に呼び出されます。

p_list.cpp はありません。そこで何かを2回削除できますか?

于 2012-09-10T21:03:04.007 に答える
2

リストには自動ストレージがあり、スコープの終了時に破棄されます。

#include "p_list.h"

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

デストラクタを手動で呼び出すと、オブジェクトを 2 回破棄しようとすることになります。

于 2012-09-10T20:58:03.617 に答える
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";
}

次に、juanchopanza が提案したように、p_list のデストラクタへの手動呼び出しを削除し、デストラクタが自動的に呼び出されるのを確認します。

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 に答える