質問 |
||
| QNo.4022917 | C++ vector中のnewしたの文字列の削除の問題 | |
|---|---|---|
| 質問者:ikutame |
C++の新人ですが、困っている質問をさせていただきます。 C++のvectorの中にchar型の文字列を格納していて、どうやって、 memory leak が発生しないようにクリアしますか? たとえば、以下の例 std::vector<char *> vc; void pushvc(); int main(){ pushvc(); } void pushvc(){ char* a = new char[10]; char* b = new char[10]; a="sss"; b="bbb"; vc.push_back(a); vc.push_back(b); } よろしくお願いします。 |
|
困り度:
|
||
| 質問投稿日時: 08/05/14 22:59 |
||
回答 |
|
| ANo.6 | いまさら回答しても無意味かもしれませんが、自分が検索(std::vector)してこのページが出てきたので、他の同じような人のために書いておきます。vectorとは全く関係無いけど… メモリリークを無くすにはという問いですが、すでに回答にある様に代入で破壊しているので開放出来ません。あえて書くなら、 char* a = new char[10]; char* b = new char[10]; delete a; delete b; a="sss"; b="bbb"; 普通に書くと char *a = "sss"; char *b = "bbb"; ついでに根本的なところの説明 この"sss"や"bbb"の実体はどこにあるのかというと感覚的に static char sss[10] = "sss"; static char bbb[10] = "bbb"; char *a = sss; char *b = bbb; こんな感じになっていると思ってください。 |
|---|---|
| 回答者:higdon | |
| 種類:アドバイス どんな人:一般人 自信:自信あり |
|
| 回答日時: 08/07/30 21:44 |
|
| |
| この回答への補足 | この回答に補足をつける(質問者のみ) |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.5 | 別解1: boost::shared_array を使う. 別解2: garbage collector を使う. お手軽には BoehmGC とか. |
|---|---|
| 回答者:Tacosan | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/05/15 01:41 |
|
| |
| この回答への補足 | この回答に補足をつける(質問者のみ) |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.4 | 悩まず std::vector<std::wstring> |
|---|---|
| 回答者:Tacosan | |
| 種類:回答 どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/05/15 00:53 |
|
| |
| この回答への補足 | この回答に補足をつける(質問者のみ) |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.3 | なにに困っているのかわからんです。 for ( int i = 0; i < vc.size(); ++i ) { delete[] vc[i]; } vc.clear(); こんだけじゃないでしょか。 |
|---|---|
| 回答者:episteme | |
| 種類:回答 どんな人:専門家 自信:自信あり |
|
| 回答日時: 08/05/15 00:23 |
|
| |
| この回答への補足 | この回答に補足をつける(質問者のみ) |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.2 | >std::vector<char*>にする理由は、 >確保したメモリ(aとbが指すところ)に文字をいれてるからです。 聞きたいのは std::vector<std::string> vc; std::string a("sss"); std::string b("bbb"); vc.push_back(a); vc.push_back(b); では何故ダメなのですか? ということです。 そして、メモリリークしているのは std::vector を使っていることが原因ではなく、 a = "sss" することで、new で確保したメモリが開放できなくなっているだけです。 |
|---|---|
| 回答者:koko_u_ | |
| 種類:補足要求 どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/05/14 23:46 |
|
| |
| この回答への補足 | 言われた通りです。 実は、やりたいことはchar * 文字列からwchar_t* に変換して、 得られたwchar * をvectorにいれたいですが、 途中でnewでchar * から wchar_t *に変換でやったが、 ここで例に例えただけですが。実は、vector<wchar_t *> になっています どうやって開放しますか? |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.1 | >memory leak が発生しないようにクリアしますか? そもそも std::vector<char*> でなく std::vector<std::string> にするのが普通のプログラマでしょう。 どうしても std::vector<char*> でないと困る理由を補足にどうぞ。 >char* a = new char[10]; >char* b = new char[10]; >a="sss"; >b="bbb"; std::vector は置いておいて、こっちを何とかする方が先か? |
|---|---|
| 回答者:koko_u_ | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/05/14 23:07 |
|
| |
| この回答への補足 | 返事ありがとうございます。 std::vector<char*>にする理由は、確保したメモリ(aとbが指すところ)に文字をいれてるからです。 よろしくお願いします。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |