dポイントプレゼントキャンペーン実施中!

次のコードをgcc5.4.0でコンパイルすると、

-----------------------------------------
#include <iostream>
#include <map>
using namespace std;

class samp{
};


int main(){

std::map<int, samp> sampls;


for(int i=0;i<3;i++){
samp *s = new samp();
sampls[i]=*s;
}

std::map<int, samp>::iterator it = sampls.begin();
while(it!=sampls.end()){
delete it->second;
sampls.erase(it);
it = sampls.begin();
}

return 0;
}
-----------------------------------------

以下のエラーメッセージが出力されるのですが、
どのように修正したらよいでしょうか?
test.cpp:21:16: error: type ‘class samp’ argument given to ‘delete’, expected pointer
delete it->second;

A 回答 (3件)

samp クラスをコピーして問題ないなら



for(int i=0;i<3;i++){
// samp *s = new samp();
samp s; // 追加
sampls[i]=s;
}

std::map<int, samp>::iterator it = sampls.begin();
while(it!=sampls.end()){
// delete it->second;
sampls.erase(it);
it = sampls.begin();
}

諸般の事情でコピーできないのでポインタで管理したいなら

//std::map<int, samp> sampls; // 以下に変更
std::map<int, samp*> sampls;


for(int i=0;i<3;i++){
samp *s = new samp();
// sampls[i]=*s; // 以下に変更
sampls[i]=s;
}

//std::map<int, samp>::iterator it = sampls.begin(); // 以下に変更
std::map<int, samp*>::iterator it = sampls.begin();
    • good
    • 0

deleteが何をするステートメントかは把握していますか?


deleteする対象はポインタでないといけません。

質問の例では it->second の型は samp なのでポインタではありません。
    • good
    • 0

本質的に


void foo()
{
int *x = new int(3);
delete *x;
}
がおかしいのと同じなんだけど, とりあえずどのような動作を期待しているんでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!