ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

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が指すところ)に文字をいれてるからです。

よろしくお願いします。
この回答へのお礼この回答にお礼をつける(質問者のみ)
最新から表示回答順に表示