【C++】STL(Standard ..
817:デフォルトの名無しさん
08/07/02 10:19:22
まずmap<int,bar*>のbar*を、直接 opertaor =(bar *ptr) 出来ないようなクラスに置き換える。
・map<int, test<bar> >
後はしらね。勝手に適当にメソッドでnewが隠蔽されるようなものでも書けば良いと思うよ。
818:デフォルトの名無しさん
08/07/02 11:20:34
>>812
たった今>>811に食われたじゃないか
819:デフォルトの名無しさん
08/07/02 11:56:46
foo* p = new foo();
if (!map.insert(std::make_pair(0, p)).second) {
delete p;
p = 0;
}
820:デフォルトの名無しさん
08/07/02 12:03:46
p = repinterpret_cast<void*>(0);
821:デフォルトの名無しさん
08/07/02 12:18:09
>>819
insertで例外起きたらメモリリークするでよ
822:デフォルトの名無しさん
08/07/02 13:35:58
>>816
それだと m[0] に既存のポインタが入っていた場合にリークする。
↓これでいいかな?
foo* p = new foo;
try
{
&nbps; foo*& in = m[n];
&nbps; delete in;
&nbps; in = p;
}
catch (...)
{
&nbps; delete p;
&nbps; throw;
}
「スマポ使えない」と言ってもさすがに auto_ptr は使えるだろうから、
↓こっちのがいいと思う。
std::auto_ptr<foo> p(new foo);
foo*& in = m[n];
delete in;
in = p.release();
823:822
08/07/02 13:37:02
うわ。 nbsp ミスった。最初のコード訂正。
foo* p = new foo;
try
{
foo*& in = m[n];
delete in;
in = p;
}
catch (...)
{
delete p;
throw;
}
824:デフォルトの名無しさん
08/07/02 20:34:55
foo * p = new foo;
try {
std::swap(p, m[0]);
delete p;
}
catch(...) {
delete p;
throw;
}
825:デフォルトの名無しさん
08/07/03 01:52:19
関数内クラスでauto_ptrもどきを自作すればいいんじゃね?
簡単に
pair<map<int,bar*>::iterator, bool> ib(map.insert(std::make_pair(0, 0)));
if (ib.second)
ib.first.second = new foo;
でも良い気がするけど。
826:デフォルトの名無しさん
08/07/05 23:35:18
こんばんは。g++でtr1::unordered_setを使おうと思ったのですが。
tr1::unordered_set< vector<unsigned char> >とすると
‘struct std::tr1::hash<std::vector<unsigned char, std::allocator<unsigned char> > >’
と怒られてしまいます。これは何が悪いのでしょうか?
(vector用のhash関数を自分で作る必要があるということでしょうか?)
827:デフォルトの名無しさん
08/07/05 23:41:48
すいませんage忘れました。
828:デフォルトの名無しさん
08/07/06 03:22:08
>>826
コードとエラーメッセージをちゃんと貼れ。
829:デフォルトの名無しさん
08/07/08 04:21:23
デバッガとかでさ、変数名長すぎでしょ。
もう嫌だ。
830:デフォルトの名無しさん
08/07/09 17:51:42
#include <iostream>
#include <vector>
using namespace std;
class A {
int val;
public:
A(){cout<<"new"<<endl;}
~A(){cout<<"delete"<<endl;}
void setval(int x){ val = x; }
int getval(void){ return val; }
};
int main () {
A a;
vector<A> list;
cout <<"------------------------------------ Line1"<< endl;
for ( int i=0; i<5; ++i ) {
a.setval( i );
list.push_back( a );
}
cout <<"------------------------------------ Line2"<< endl;
//cout << "size:\t\t" << list.size() << endl;
//cout << "list[data,3]:\t" << list[data, 3] << endl;
for ( unsigned int i=0; i<list.size(); ++i ) {
cout<< list[a,i].getval() << endl;
}
cout <<"------------------------------------ Line3"<< endl;
list.clear();
cout <<"------------------------------------ Line4"<< endl;
return 0;
}
831:デフォルトの名無しさん
08/07/09 17:54:23
Line1とLine2の間の
push_backのリサイズ時では何が起こっているのでしょうか
832:デフォルトの名無しさん
08/07/09 18:14:06
capacityが要素を保持するのに足りなければ、メモリの再確保が起きている。
833:デフォルトの名無しさん
08/07/09 18:46:38
ということは、一度破棄していると言うことでしょうか
834:デフォルトの名無しさん
08/07/09 19:57:59
そのクラスAにコピーコンストラクタも書いてみ
835:デフォルトの名無しさん
08/07/09 20:48:24
A(const A &obj){cout<<"copy"<<endl;} と
push_back後に1loopの目安として新しく
cout<<"----------------------------------"<<endl;
を付け足して走らせてみたところ
Line1とLine2の間の"copy"と"delete"の表示が
copy がpushした回数+1
deleteがpushした回数
になりました。
copyの回数が+1なのが気になります。
入れる側の参照+listに入っている数と考えそうになりましたが
これでサイズを比べて足りないようなら再確保…と考えるのは変よですね
copyとdeleteの順番と回数を考えると
前のvectorから入っている分コピーした回数+付け足す側からコピーの一回分
という事でしょうか
836:デフォルトの名無しさん
08/07/09 20:58:59
あれ、ちょっと変ですね…3回目のプッシュで考えると
既にpushされているのが2個なので
copy ←コピーしようとした
ここでサイズが足りないので再確保
copy ←コピーしようとした
copy ←前のvectorからコピー
copy ←前のvectorからコピー
delete ←入れようとした時のテンポラリの破棄?
delete ←前のvectorに入ってるのを破棄
delete ←前のvectorに入ってるのを破棄
でしょうか、なんだか混乱してきました…。
837:デフォルトの名無しさん
08/07/09 21:23:27
ここでサイズが足りないので再確保
copy ←前のvectorからコピー
copy ←前のvectorからコピー
copy ←前のvectorからコピー
copy ←新しい要素のコピー
delete ←前のvectorに入ってるのを破棄
delete ←前のvectorに入ってるのを破棄
delete ←前のvectorに入ってるのを破棄
だろ。まぁ新しい要素をどこでコピーするかは実装依存だろうが。
valの値も表示させれば分かるべ。
838:デフォルトの名無しさん
08/07/09 21:43:28
それが4回目のpush_backなら納得できるのですが
3回目のpush_backでcopyが4つ表示されているので混乱しています。
839:デフォルトの名無しさん
08/07/09 21:49:50
iが3だから3回目とか勘違いしてないか?
840:デフォルトの名無しさん
08/07/09 21:54:59
略
copy
copy
delete
-----------0
copy
copy
copy
delete
delete
delete
-----------1
copy
copy
copy
copy
delete
delete
delete
-----------2
略
こう表示されています
環境は VC++2005EE +SDK win2000 です
841:デフォルトの名無しさん
08/07/09 21:56:29
class A {
int val;
public:
A(){val=0,cout<<"new"<<endl;}
A(const A &obj){cout<<"copy"<<endl;}
~A(){cout<<"delete"<<endl;}
void setval(int x){ this->val = x; }
int getval(void){ return val; }
};
略
cout <<"------------------------------------ Line1"<< endl;
for ( int i=0; i<5; ++i )
{
a.setval( i );
list.push_back( a );
cout<<"----------------------------------"<< i <<endl;
}
cout <<"------------------------------------ Line2"<< endl;
略
ソースはこうなってます
842:デフォルトの名無しさん
08/07/09 22:03:30
copy
----------------------------------0
copy
copy
delete
----------------------------------1
copy
copy
copy
delete
delete
----------------------------------2
うちではこうなった。
VC++2008EE
forループ入る前にvectorになんか入れてない?
size()の値表示させてみ。
843:デフォルトの名無しさん
08/07/09 22:06:00
これが全文です。
#include <iostream>
#include <vector>
using namespace std;
class A {
int val;
public:
A(){val=0,cout<<"new"<<endl;}
A(const A &obj){cout<<"copy"<<endl;}
~A(){cout<<"delete"<<endl;}
void setval(int x){ this->val = x; }
int getval(void){ return val; }
};
int main (){
A a;
vector<A> list;
cout <<"------------------------------------ Line1"<< endl;
for ( int i=0; i<5; ++i ){
a.setval( i );
list.push_back( a );
cout<<"----------------------------------"<< i <<endl;
}
cout <<"------------------------------------ Line2"<< endl;
for ( unsigned int i=0; i<list.size(); ++i ) {
cout<< list[a,i].getval() << endl;
}
cout <<"------------------------------------ Line3"<< endl;
list.clear();
cout <<"------------------------------------ Line4"<< endl;
return 0;
}
844:デフォルトの名無しさん
08/07/09 22:36:38
2005入れてないから2003でやってみたらそうなった。
ソース追ってみると、追加する要素を一旦ローカル変数にコピーしてた。
その変数のコピーと破棄が1回ずつ多いみたい。
2005のソースはわからんが多分同じ理由だろう。
845:デフォルトの名無しさん
08/07/09 22:41:38
なるほど、これで胸のつかえが取れました
付き合ってくれた皆さん、本当にありがとうございました。
846:デフォルトの名無しさん
08/07/09 23:04:39
>>844
>追加する要素を一旦ローカル変数にコピーしてた。
list.push_back( list[3] );
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4974日前に更新/192 KB
担当:undef