トップページ⇒tech
1001コメント296KB

C++相談室 part54

■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v2006/10/30(月) 22:34:08
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

テンプレその他 >>2-15 付近参照

前スレ
C++相談室 part53
http://pc8.2ch.net/test/read.cgi/tech/1159340181/
0002v(^・^)v2006/10/30(月) 22:34:41
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない)
[禿 Stroustrup]
 http://public.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
0003v(^・^)v2006/10/30(月) 22:35:03
■Books■
amazon.com C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

The C++ Programming Language
 ttp://www.amazon.com/exec/obidos/ASIN/0201700735/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 ttp://www.amazon.com/exec/obidos/ASIN/0201824701/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 ttp://www.amazon.com/exec/obidos/ASIN/0201379260/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 ttp://www.amazon.com/exec/obidos/ASIN/0201924889/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 ttp://www.amazon.com/exec/obidos/ASIN/020163371X/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 ttp://www.amazon.com/exec/obidos/ASIN/0201615622/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 ttp://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
 ttp://www.amazon.com/exec/obidos/ASIN/0201760428/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)
C++ Coding Standards
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4894716860/ (翻訳)
0004v(^・^)v2006/10/30(月) 22:35:30
■Books(Templateまわり)■
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/
0005v(^・^)v2006/10/30(月) 22:35:50
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache STDCXX http://incubator.apache.org/stdcxx/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
 (日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0006v(^・^)v2006/10/30(月) 22:36:12
1 http://piza.2ch.net/tech/kako/980/980175292.html
2 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html
0007v(^・^)v2006/10/30(月) 22:36:32
16 http://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
17 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/
0008v(^・^)v2006/10/30(月) 22:36:53
31 http://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/
39 http://pc5.2ch.net/test/read.cgi/tech/1106466303/
39(実質40) http://pc8.2ch.net/test/read.cgi/tech/1106527792/
40(実質41) http://pc8.2ch.net/test/read.cgi/tech/1113408957/
41(実質42) http://pc8.2ch.net/test/read.cgi/tech/1120190961/
43 http://pc8.2ch.net/test/read.cgi/tech/1124113879/
44 http://pc8.2ch.net/test/read.cgi/tech/1128512737/
45 http://pc8.2ch.net/test/read.cgi/tech/1133007604/
0009v(^・^)v2006/10/30(月) 22:37:13
46 http://pc8.2ch.net/test/read.cgi/tech/1136690107/
47 http://pc8.2ch.net/test/read.cgi/tech/1139931895/
48 http://pc8.2ch.net/test/read.cgi/tech/1142423595/
49 http://pc8.2ch.net/test/read.cgi/tech/1146185570/
50 http://pc8.2ch.net/test/read.cgi/tech/1149427282/
51 http://pc8.2ch.net/test/read.cgi/tech/1153079297/
52 http://pc8.2ch.net/test/read.cgi/tech/1156525695/
53 http://pc8.2ch.net/test/read.cgi/tech/1159340181/

■関連スレ■
多すぎ。とりあえずスレタイ C++ で検索して。
以下、スレタイで見つからなさそうな関連スレ。

Boostを語れゴラァ part3
http://pc8.2ch.net/test/read.cgi/tech/1158991211/
GCCについて part7
http://pc8.2ch.net/test/read.cgi/tech/1145357824/
0010デフォルトの名無しさん2006/10/30(月) 22:38:15
乙
0011デフォルトの名無しさん2006/10/30(月) 22:43:36
>>1
もつかれ�d。
0012デフォルトの名無しさん2006/10/30(月) 22:45:43
Boostつかうと一気に実行ファイルサイズが100倍に?!
0013デフォルトの名無しさん2006/10/30(月) 22:53:45
>Boostつかうと一気にコンパイル時間が100倍に?!
環境によるだろ。
俺はVC++に /Yc オプションを指定して、極力
プリコンパイルヘッダを使用するようにして使っているが、例えばboost::lambdaを
使っても使わない時と比べ10秒ほどしか増えない。
0014デフォルトの名無しさん2006/10/30(月) 23:05:37
STLつかうと一気に実行ファイルサイズが10倍に?!
0015デフォルトの名無しさん2006/10/30(月) 23:08:52
>>12
あれ?こんなのあったっけ?
0016デフォルトの名無しさん2006/10/30(月) 23:12:16
>>15
ないね
0017デフォルトの名無しさん2006/10/30(月) 23:16:38
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
0018デフォルトの名無しさん2006/10/30(月) 23:17:47
#include <stdafx.h>
後死ね。
0019デフォルトの名無しさん2006/10/30(月) 23:18:31
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0020デフォルトの名無しさん2006/10/30(月) 23:20:15
プリコンパイル済みヘッダ使っても
自作パーサとSpiritじゃマジでコンパイル時間100倍になるぜ。
0021デフォルトの名無しさん2006/10/30(月) 23:20:23
>>14
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0022デフォルトの名無しさん2006/10/30(月) 23:32:40
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0023デフォルトの名無しさん2006/10/30(月) 23:36:23
template<C++相談室>は>>50まで続きます



                〜しばらくおまちください〜
0024デフォルトの名無しさん2006/10/30(月) 23:52:44
任意のタイミングでファイルオープンとファイルクローズが出来るデバックツール探してます。
CreateFileとかCopyFile等の動作チェック用です。
自分で作ってもいんですが、既に多機能な機能やグラフィカルなツールがあるかもしれないので探しています。
VisualStudioパッケージあるかもしれんがようわからん。
誰か知らないか?
0025デフォルトの名無しさん2006/10/30(月) 23:56:44
>>24
スレ違い。意味が分からんからどこ行っても答えは得られないだろうが。
0026デフォルトの名無しさん2006/10/31(火) 00:24:29
>>24
メモ帳
0027デフォルトの名無しさん2006/10/31(火) 01:57:43
;゚д゚)<ここまでテンプレ
                     Σ(゚Д゚;エーッ!!
0028デフォルトの名無しさん2006/10/31(火) 02:14:54
アフロいきまーす
0029デフォルトの名無しさん2006/10/31(火) 02:34:57
クラステンプレートにストリーム演算子をオーバーロードさせることは不可能なんですか?
0030デフォルトの名無しさん2006/10/31(火) 02:37:48
>>29
それだけ聞くとできそうに思う。
何故不可能だと思ったのかね?
0031デフォルトの名無しさん2006/10/31(火) 02:37:55
>>29
環境による
0032デフォルトの名無しさん2006/10/31(火) 03:19:33
>>29
こういうやつのことか?

template <typename T>
class A { public: T v; };

template <typename T>
std::ostream& operator<<(std::ostream& os, const A<T>& v)
{ return os << v.v; }
0033デフォルトの名無しさん2006/10/31(火) 15:14:17
>>32
その通りです

>>31
GCCだと単純に>>32のように書くとコンパイルエラーになります
Tの型が未決定なためエラーになるようです

なんかうまい方法はないでしょうか
0034デフォルトの名無しさん2006/10/31(火) 15:49:09
>>33
gcc-3.3.6, gcc-3.4.6, gcc-4.0.3, gcc-4.1.1 on Linux でコンパイル通るぞ。
コードの別のところの問題だろう。

手元で通したコード全文はこれ。

#include <iostream>
#include <ostream>

(ここに >>32 を入れる)

int main(void)
{
 A<int> a;
 a.v = 1;
 std::cout << a << std::endl;
 return 0;
}
0035デフォルトの名無しさん2006/10/31(火) 18:25:41
29ができないようでは、std::basic_stringが入出力できなくなる。
逆に言うとできないわけがない。
0036デフォルトの名無しさん2006/10/31(火) 23:29:17
class A{
int a
int b
std::string str;
};

class B{
int a
int b
vector<double>v_fat;
};

class C{
int a;
int b;
map<std::string, int>num;
};

こんな似た様なメンバを持つクラスをJavaのArrayListみたいに
扱いたいときはどうするのですか?Objectクラスみたいなのを
作ってキャストすればOK?
0037デフォルトの名無しさん2006/10/31(火) 23:34:29
boost::variantとか、boost::anyとか、下のページのようにとか。
ttp://www.ksky.ne.jp/~seahorse/cpp/virtualbase.html

どれにしてもテンプレートを使って、1つの型に押し込んでいることには違いない。
0038デフォルトの名無しさん2006/11/01(水) 01:42:08
>>36
共通部分を基底クラスにくくりだし、その基底クラスへのポインタの配列を作ればいい。
必要に応じて dynamic_cast する。しないでいい設計のほうが好ましいんだけど。
0039デフォルトの名無しさん2006/11/01(水) 01:49:07
>>37
そこの FruitItem は

template <class T>
class FruitItem : public Fruit, T {
public:
FruitItem() {}
FruitItem(const T& y) : T(y) {}
const char* color() const { return T::color(); }
};

としたほうがよさそうだな。
0040デフォルトの名無しさん2006/11/01(水) 18:03:37
template <class Target, class Source>
Target lexical_castSource arg)
{
    std::stringstream interpreter;
    Target result;

    if (!(interpreter << arg) || !(interpreter >> result) || !(interpreter >> std::ws).eof()) {
        throw bad_lexical_cast();
    }

    return result;
}
Exceptional C++ Style で上のような記述を見かけたのですが、
>!(interpreter >> std::ws).eof()
の部分は何を行っているのでしょうか?
std::wsというのは初めて見ました
検索しても関係ないページがヒットしてしまい意味がつかめません・・・
0041デフォルトの名無しさん2006/11/01(水) 18:49:39
>>40
C++標準ライブラリ
§13.1.5 マニピュレータ

wsはistreamに適用して、空白を読み飛ばす
0042デフォルトの名無しさん2006/11/01(水) 20:45:37
本体はどこで入手できますか?買うのでしょうか?
0043デフォルトの名無しさん2006/11/01(水) 21:12:53
本体とは?
0044デフォルトの名無しさん2006/11/01(水) 21:37:20
>>42
ttp://www.google.co.jp/
0045デフォルトの名無しさん2006/11/01(水) 21:44:59
Visual C++とかの書き込む奴です
0046デフォルトの名無しさん2006/11/01(水) 22:28:24
スレ違い
0047デフォルトの名無しさん2006/11/01(水) 22:47:11
ちょっとした質問です。

namespace A
{
 struct X {};
 void *operator new (size_t n, X&) { return 0; }
 void f()
 {
  X c;
  new (c) int; // ←ここ
 }
}

"ここ"で(size_t n, X&)に適合する呼出が見つかりませんと言われてしまいます。
ネームスペースAからグローバルスペース?に移すと難なく通ります。
operator new (...)で呼び出すとネームスペースから外さなくてもエラーになりません。
仕様でしょうか?

ちなみにVS2003です。
0048デフォルトの名無しさん2006/11/02(木) 00:05:40
質問です。

//敵の生成時に一時的に入れる変数と、敵をまとめて管理する変数
EnemyObj*       enemy;
vector<EnemyObj*>  EnemyArr;

//敵の生成時に呼ばれる関数
enemy = new Enemy1(arg_x, arg_y);
EnemyArr.push_back(enemy);

このようにした場合、例えばこれで敵を三体生成したとして、
(EnemyArr[0], EnemyArr[1], EnemyArr[2])
この中から

delete EnemyArr[1];

としてもオブジェクトが破棄されないので困っています。
一番最後に生成した物(この場合EnemyArr[2])なら破棄できるみたいなのですが・・・。
一体どうしたらいいでしょう。
0049デフォルトの名無しさん2006/11/02(木) 00:19:22
>>48
本当か?もう一度よく考えてみろ。
0050デフォルトの名無しさん2006/11/02(木) 00:21:32
>>49
えっと、それはどういう意味でですか?
「破棄できないはずはない」のか、「根本的なミスをしている」のか
どっちの意味でしょう。
0051デフォルトの名無しさん2006/11/02(木) 00:22:12
逆に聞くけど、破棄されてない事はどうやって確かめてるの?
0052デフォルトの名無しさん2006/11/02(木) 00:28:04
>>51
オブジェクトが普通に表示されたり、
deleteする前の値(位置情報 xやyなど)
をそのまま持っているかどうかで確認しています。
0053デフォルトの名無しさん2006/11/02(木) 00:29:46
>>48
> enemy = new Enemy1(arg_x, arg_y);
> EnemyArr.push_back(enemy);
原因の予感。push_back(const T&)じゃなかったか。
ゆえに、push_back(new Enemy1(arg_x, arg_y))で試してみて。
0054デフォルトの名無しさん2006/11/02(木) 00:34:07
>>52
それって、破棄したオブジェクトをそのまま使ってるんじゃないか?
erase()でvectorの方も縮めておかないとだめだろ。
0055デフォルトの名無しさん2006/11/02(木) 00:34:33
>>52
deleteしたからって中のデータは直ぐに破壊されん。
そんなん何の参考にならんし確認にもなってない。
0056デフォルトの名無しさん2006/11/02(木) 00:36:15
まあコンテナにポインタだけを入れるのなら、boost::ptr_vectorの方が
使いやすいぞ。erase()したら自動的にdeleteしてくれるしな。
0057デフォルトの名無しさん2006/11/02(木) 00:42:11
ちょっと状態遷移にそって処理を行いたいのですが解らないことがあります。
各個別は古典的にstateパターンで処理可能なルールとして実装できると思いますが
文脈を管理するためのクラスはどのように実現するのが一般的なのでしょうか?
ルールはR0 = Aから始まるとします。

A = B | C
B = a b c
C = a | b c
a = ...
b = ...

StateパターンでR0の状態を処理する。
0058デフォルトの名無しさん2006/11/02(木) 00:42:59
deleteしてもそのポインタの指してる先が0でクリアされるわけじゃないから
ポインタが指してる部分に情報が残ってるだけでは?
デストラクタにstd::cout << "Delete Enemy" << std::endl;って行を入れて動作を確認してみて。
0059デフォルトの名無しさん2006/11/02(木) 00:44:19
>>57が何を言いたいのか全然わからない
0060デフォルトの名無しさん2006/11/02(木) 00:45:17
>>54,55
成る程、そういうことでしたか。
eraseする前に破棄されてるか確認したかったのですが、
それでは意味がないですね。

>>53
結局破棄されてないと勘違いしただけだったみたいですが、
その記述で一時的な変数が必要なくなって助かりました。

>>56
そういう便利なものもあるんですね。
ちょっと調べてみたいと思います。

>>58
成る程、デストラクタに入れておけば破棄された確認になりますね。
やってみます。
0061デフォルトの名無しさん2006/11/02(木) 00:50:43
自分で書いてて意味不明だな。
とりあえず、文法を解析するときに
個別のルールはStateパターンで処理したいけど
文脈はどうやって処理すればいいのか思いつかないから助けて
ほしいだけかもしれない
0062デフォルトの名無しさん2006/11/02(木) 00:53:03
vectorにポインタを入れておいて、deleteした後その要素を使いたく
ないなら、0を代入しておく方法もある。vectorコンテナは要素数が
大きくなると、eraseにO(N)かかるので高くつく。そこでdeleteした要素
には0を入れておき、後で必要になったらまず0の入っている要素を
再利用するという方法もある。

もちろんプログラム側で要素に0が入っていたら処理をスキップする
必要があるが。
0063デフォルトの名無しさん2006/11/02(木) 00:54:59
>>61
まずデザパタに頼らず強引に文法解析の骨子を書いてみたら。
その後でStateパターンでまとめると綺麗にまとまるというだけの話。
0064532006/11/02(木) 00:56:07
>>60
ごめん俺が間違ってた。気にするな。
>EnemyObj*       enemy;
もちろんvirtualなデストラクタを持たせてるよね
0065デフォルトの名無しさん2006/11/02(木) 01:03:50
>>53
push_back(new ...) はあからさまに例外安全じゃないので考え直したほうがいい。
0066デフォルトの名無しさん2006/11/02(木) 01:20:55
>>58
破棄の確認が取れました。
ちゃんと破棄できていたようです。有難う御座います。

>>62
成る程、そういった利用方法もできるのですかぁ。
勉強になります。

>>64
持たせて破棄の確認をしました。
お騒がせしました。

>>65
それは
push_back(new ...)
にするより、元のコードのままの方がいいということですか?
0067デフォルトの名無しさん2006/11/02(木) 01:27:11
newが例外を投げる可能性があるからね。
コンテナに対する操作とは分離しておいた方がいいだろう。

それと、コンテナの要素にアクセスする方法が単なるラウンドロビン的な
方法のみで、ランダムアクセスをしないのであればstd::listの採用を考え
るのもよい。こちらはeraseしても反復子が無効にならない上、常にコストは
O(1)だから。
0068デフォルトの名無しさん2006/11/02(木) 01:27:12
>>47
new に対応する operator new はクラスのメンバとして宣言されたものか、
グローバルなものかのどちらかになる。 (5.3.4 9)
0069デフォルトの名無しさん2006/11/02(木) 01:28:15
>>67
問題は push_back() が例外を投げた場合なわけだが。
0070デフォルトの名無しさん2006/11/02(木) 01:29:52
>>66
元のコードも多分例外安全じゃない(いや、まcatchで適切にリソースの解体しているなら別だけど)

auto_ptr<Enemy>enemy(new Enemy(..));
EnemyAry.push_back(enemy.get());
enemy.release();

だいたいこんな感じで書けば例外安全。
0071デフォルトの名無しさん2006/11/02(木) 01:32:33
>>70
ちょwwwwそれやり過ぎww
まあ業務用ソフトならそこまでするのかもしれんけど
0072デフォルトの名無しさん2006/11/02(木) 01:40:29
>>67,70
うーむ、まだまだ未熟で理解できない点がありますので、
これから習熟していく上で徐々に理解していきたいと思います。
有難う御座いました。
0073デフォルトの名無しさん2006/11/02(木) 01:42:36
>>70は別にやりすぎとは思わないな
これくらいがふつう
0074デフォルトの名無しさん2006/11/02(木) 01:45:22
だよな。
いつの日か、こんなのがリークの原因になってしまったとしたら、見つける自信が無い。
最初に書くときに安全を確保してしまうのが吉。
0075デフォルトの名無しさん2006/11/02(木) 01:47:45
>>70
これって、もしEnemyAryがptr_vectorだったら例外安全難しくない?
1.
auto_ptr<Enemy>enemy(new Enemy(..));
EnemyAry.push_back(enemy.get());
enemy.release();
→enemy.release()が例外を投げるとptr_vectorとauto_ptrによる二重delete
2.
auto_ptr<Enemy>enemy(new Enemy(..));
EnemyAry.push_back(enemy.release());
→push_backが例外を投げるとリーク
0076デフォルトの名無しさん2006/11/02(木) 01:51:02
>>75
releaseは例外を投げなーい。
だから安心安心。
0077デフォルトの名無しさん2006/11/02(木) 01:58:46
>>75
prt_vector なら push_back(new ...) でいいだろ。 >>70 みたいな
コーディングを不要にするためのものなんだから。
0078デフォルトの名無しさん2006/11/02(木) 02:03:00
push_backが例外投げたらどうすんだよ!
0079デフォルトの名無しさん2006/11/02(木) 02:08:32
push_backって例外投げたっけ?
0080デフォルトの名無しさん2006/11/02(木) 02:08:38
>75
auto_ptr::release()は例外投げません……
0081デフォルトの名無しさん2006/11/02(木) 02:10:45
>>79
少なくともバッファが確保出来ないときは投げるんじゃない?
0082デフォルトの名無しさん2006/11/02(木) 02:11:44
>>79
配列の拡張時にメモリ確保失敗する可能性があるから投げると思うよ。
ちょっとソース見てくる。
0083822006/11/02(木) 02:21:02
見てきた。
>>77のいうようにptr_*系は直接push_back呼び出して問題ない。
というか内部でauto_ptrつかって実質的に>>70と同じ処理をやってる。
だから、むしろauto_ptr使うと例外時に2重開放になるから使っちゃ駄目。

例外発生時にはpush_backは何もしないと思ってたので、
勝手に引数の開放するのは予想外だったのでちょっと驚き。

これからはptr_*系をちょくちょく使っていくか......
0084デフォルトの名無しさん2006/11/02(木) 02:23:11
うげ、勝手に引数の状態変えるのかよ・・・
0085デフォルトの名無しさん2006/11/02(木) 02:29:03
そういえば、失敗したときに勝手に delete するんなら Strong guarantee とは
言えないな。

あれー?
http://www.boost.org/libs/ptr_container/doc/ptr_sequence_adapter.html#modifiers
0086デフォルトの名無しさん2006/11/02(木) 02:49:00
質問なんですが、関数の実引数や仮引数に auto_ptr<> を頻繁に使うことってあるんでしょうか?
0087デフォルトの名無しさん2006/11/02(木) 02:53:46
>>86
new したオブジェクトの所有権が関数をまたいで頻繁に移動するならそうなるだろう。
0088デフォルトの名無しさん2006/11/02(木) 03:22:22
>>87

なるほど。忘れていました。そうですよね。所有権が移動するから使えるんですか。
ありがとうございます。
0089デフォルトの名無しさん2006/11/02(木) 03:23:08
そもそもauto_ptrって頻繁に使いますか??

使わんとは言わんが、結局目の届く範囲においとかないと怖くて仕方ないので
エラー処理とかでdeleteまとめんのが面倒くさいとかの時くらいしか出番ないですよ。
叩いて叩いて。
0090デフォルトの名無しさん2006/11/02(木) 03:31:52
リソースリークを防止する一番簡単な方法がauto_ptr
0091デフォルトの名無しさん2006/11/02(木) 03:43:15
自前でdeleteする手間とほとんど変わらん、便利よりも不便のが増えるで、
あればあったで構わないけど積極的な使用を推奨する気にはなれん代物でFA。
0092デフォルトの名無しさん2006/11/02(木) 03:46:02
>>89
new があるところに auto_ptr あり。少なくとも new と同じぐらい使う。
boost 使ってるときは、ほとんどそっちになるけど。
0093デフォルトの名無しさん2006/11/02(木) 03:46:45
>>91
auto_ptr で増える不便って何?
0094デフォルトの名無しさん2006/11/02(木) 04:00:22
>>91
手動deleteで例外安全確保しようと思ったらauto_ptrの100倍は面倒だろ
0095デフォルトの名無しさん2006/11/02(木) 04:08:20
例外安全性なんて知ったことじゃありまっせん!
0096デフォルトの名無しさん2006/11/02(木) 06:42:13
例外発生時点でそこから先計算不能な状態なんで書き込みリソースくらいしか例外安全に気を遣わない。
つか例外でたらabortせざるをえない。
0097デフォルトの名無しさん2006/11/02(木) 09:30:17
>>68
遅くなりました。
ネームスペースに入れるとクラスのメンバのような扱いになっているって事ですか??
もう少しヒントを・・・
0098デフォルトの名無しさん2006/11/02(木) 10:44:22
>>96
あー、よく聞くな。そのいいわけ。
0099デフォルトの名無しさん2006/11/02(木) 10:45:53
>>97
new を使ったときにメモリ確保に使われる operator new の決定方法は規格で
決められているわけだが、(以下 >>68 )
0100デフォルトの名無しさん2006/11/02(木) 12:17:19
>>96
始皇帝氏って奴?
0101デフォルトの名無しさん2006/11/02(木) 15:17:56
template<class T> class Test
{
vector<T> array;
public:
vector<class T>::iterator getBeginIterator()
{
return array.begin();
}
};

こんなクラスを作ったのですが
main関数で
Test<unsigned char> test1;
vector<unsigned char>::iterator itr = test1.getBeginIterator();
とすると
main.cpp(37) : error C2440: '初期化中' : 'std::vector<_Ty>::iterator' から 'std::vector<_Ty>::iterator' に変換できません。
というエラーがでます。
どなたか原因がわかりませんか?
■ このスレッドは過去ログ倉庫に格納されています