• 締切済み

C++ vector中のnewしたの文字列の削除の問題

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); } よろしくお願いします。

みんなの回答

  • higdon
  • ベストアンサー率0% (0/0)
回答No.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; こんな感じになっていると思ってください。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

別解1: boost::shared_array を使う. 別解2: garbage collector を使う. お手軽には BoehmGC とか.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

悩まず std::vector<std::wstring>

回答No.3

なにに困っているのかわからんです。 for ( int i = 0; i < vc.size(); ++i ) {  delete[] vc[i]; } vc.clear(); こんだけじゃないでしょか。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.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 で確保したメモリが開放できなくなっているだけです。

ikutame
質問者

補足

言われた通りです。 実は、やりたいことはchar * 文字列からwchar_t* に変換して、 得られたwchar * をvectorにいれたいですが、 途中でnewでchar * から wchar_t *に変換でやったが、 ここで例に例えただけですが。実は、vector<wchar_t *> になっています どうやって開放しますか?

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.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 は置いておいて、こっちを何とかする方が先か?

ikutame
質問者

補足

返事ありがとうございます。 std::vector<char*>にする理由は、確保したメモリ(aとbが指すところ)に文字をいれてるからです。 よろしくお願いします。

関連するQ&A

  • C++ STL vectorの使い方

    こんばんは。 C++のstd::vectorに関する質問です。 vectorをポインタ渡しにしたときに メンバにアクセスする方法を知りたいのですが・・・ 以下ソースの☆の部分をどう記述したらよいでしょう? #include <vector> typedef struct test {  char name[10];  char id[2]; } TEST; void funcVectorTest( std::vector<TEST> *a); int main(){  std::vector<TEST> a;  int i;  TEST foo= {"Taro","0"};  a.push_back(foo);  printf("%s",a[0].name);  a.push_back(foo);  printf("%s",a[1].name);  funcVectorTest(&a);//vectorのアドレス渡しテスト  printf("%s", a[2].name);//vectorのアドレス渡し確認  return 0; } void funcVectorTest( std::vector<TEST> *a) {  int i;  int cnt;  TEST *b;  b = new TEST[3];  TEST foo= {"Taro","0"};  a->push_back(foo);  cnt = a->size();  for( i = 0; i < cnt;i++){  //以下でa[i]のnameにアクセスしたいのですがうまくいっていません。  //☆strcpy( b[i].name, a[i]->name );  }  delete[] b; } お分かりになる方、お知恵をお貸し下さい(><) vectorについて最近知ったばかりでいまいち使い方が 分かっていない部分があるので このやり方がまずいということであれば教えていただけると 助かります。 よろしくお願いしますm( _ _ )m

  • C++での戻り値について

    C++で以下のソースを書きました。 どうしてaaaは問題ないのにbbbはだめなのかがわかりません。 どちらも、func1()、func2()で設定した文字列・vectorのポインタを返したいです。 int main() { const char* aaa = NULL; std::vector<const char*>* bbb = NULL; aaa = func1(); bbb = func2(); } const char* func1() { const char* str = NULL; str = "test"; return str; } std::vector<const char*>* func2() { std::vector<const char*>* str2 = NULL; str2->push_back("test2"); str2->push_back("test3"); return str2; } 現在必要に迫られてC++勉強中です。よろしくお願いいたします。

  • C++ vectorに配列をプッシュしたい

    C++のstd::vectorが格納する要素として配列を指定することはできますか vectorを使って2次元配列を表現したいときは,たとえば std::vecor<std::vector<int>> v; とすれば2次元配列が表現できますよね. 2次元配列の列方向の要素数が2で固定されていて,行方向の要素数が不確定のデータを扱いたいので,2次元配列を格納するvectorで扱えればなと思いました. (2個で1組のデータがたくさんあるということなので,vectorの2次元配列ではありません) std::vector<int[2]> v; int a[2]; a[1] = 1; a[0] = 2; v.push_back(a); という書き方ではコンパイルできなかったのですが,vectorに配列要素を格納させることはできないのでしょうか. あるいは,もし可能ならどのように書けばよいのでしょうか. 結局は1組のデータセットを構造体化してそれをvectorにプッシュするやり方に落ち着いたのですが,疑問に思ったままモヤモヤしているので質問させて頂きます. 「vector 配列」などのキーワードで検索してみましたが,vectorの動的配列としての紹介記事が多くヒットしてしまい,自分ではうまく情報を発見することはできませんでした. よろしくお願いします.

  • vectorで文字列の配列を使う方法

    vector<string>を使用せずpush_back("aaa")が使えるようなvector配列を用意することはできませんか? vector<char[4]> vec;ができたらうれしいのですがこれはコンパイルできませんでした。

  • C++ vector beginについて

    VC++2010にて 1.下記コードにおいて、変数iPと変数aの値(アドレス)が同じになると思ったのですが、異なる値になります。なぜでしょうか。 2.「&iPVector.begin()」はiPVectorの先頭の実体を返すので、int*型が返却されると思うのですが、「int* iP = (int*)&iPVector.begin();」というように、(int*)をつけて明示的にキャストしなければビルドが通りません。なぜでしょうか。 よろしくお願いします。 ----------------- std::vector<int*> iPVector; int* a; a = new int(2); iPVector.push_back(a); int* iP = (int*)&iPVector.begin();

  • vector<char *> のデータの問題について

    C++の初心者ですが、現在勉強中です。 私が今以下のような問題があります。 class myclass{ private: vector<char *> mystring; public: void setVetcot(); void printvector(); }; void myclass::setVetor(){ mystring.push_back("sample"); } void myclass::printvecot(){ print("%s", *mystring); } int main(){ myclass m; m.setVetcot(); m.printvetcot(); } vectorの内容がなくなります。問題がどこでしょうか?

  • C++のvectorについて教えてください。

    C++のvectorについて教えてください。 現在悩んでいる問題について簡単に説明するために、テストコードを書きました。 #include <vector> class IntType { private: int num; public: IntType( int n ):num( n ){}; }; std::vector< IntType > IntVector; void main() { } このコードをDebug版でコンパイルすると 1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(285) : error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して 'const size_t' から減少できませんでした 1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(2236) : 'std::operator <' の宣言を確認してください。 のようなエラーが出ます。 しかし、Release版でコンパイルするとコンパイルは通ります。 Debug版でコンパイルを通すにはどのようなコードを追加すればよいでしょうか? 知恵を貸してください。 よろしくおねがいします。 /** VisualStudio2008 AcademiEdition */

  • 配列内の文字列を読み込む方法

    C++言語において質問です。あまり詳しくないので、変な質問でしたらすみません。 配列の文字列内にスペースが有る場合とない場合で表示を分けるものを作りたいと 思っています。 以下のようなものを書いた所、動くけど『iがいらない』、『メモリリークしている』 という風に言われました。自分でも調べてみたのですが、2つの事を解決できません。 どのようにすればよいのか、お教え願えませんか。 又、この場合のメモリリークとはどういう意味なのでしょうか? #include <stdio.h> #include <string.h> #include <ctype.h> char* name_list[] = {"", "AAA A", "BBBB", 0}; void main(){ int i = 1; char *b=0; for(char** a = &name_list[1]; *a != 0; a++, i++){ for(char* p = *a; *p != '\0' && !isspace((unsigned char)*p); p++) ; if(*p != '\0'){ b = new char[strlen(name_list[i]) + 3]; sprintf(b, "space %s", name_list[i]); } else { b = new char[strlen(name_list[i]) + 1]; strcpy(b, name_list[i]); } fprintf(stderr, "%s\n", b); } return; }

  • STLについて

    VC++6を使っています。ベクタを戻り値とするプログラムを書いています。効率が悪く感じるのですが、STL?ではこういうやり方は正しいのでしょうか? また、一般的にSTLで引数や戻り値を扱う場合、どのようなタイプ(string?)を使えば、効率よく、きれいなプログラムが書けるのでしょうか? class A{ ... } vector<A> test(void){ vector<A> ret; for (int i = 0; i < 1000; i++){ ret.push_back( A(i) ); } return ret; } vector<A> a = test(); // 巨大なコンテナが返され、aにコピーされる? ※基本的に戻り値の仕組みが理解不足です。 char *の場合は、char配列のポインタが返され、新たな変数にポインタ値がコピーされるという解釈で結構ですか? char * sample(void){ char *p = new [1000]; return p; } char *q = sample();

  • C++ の new演算子について

    C++ の new演算子について質問です。 new演算子を用いてクラスのインスタンスを作ったときに、 クラスのメンバー関数内で使用される自動変数はメモリの何処に割り付けられますか? 以下の回答の内のいずれかと想定しています。 ・ヒープ領域 ・スタック領域 たとえば、以下のように、クラスTestClassが定義されていたとします。 class TestClass { int x; // int型(4byteとする) char y; // char型(1byte) long z; // long型(4byte) void play(short); } void main(void){ TestClass* pt = new a(); play(10); } void TestClass:: play(short n){ char a; long b; static c; for(int a = 0; a < 10; a++ ){ b = n * a; cout << b; } } main関数内で、インスタンスを作成した時点で ・TestClassのデータメンバx,y,z ⇒ ヒープ領域に確保(4+1+4 = 9byte。もしかしたらアライメント     の関係で もう少し大きく領域を確保するかも) ・play関数で使われる変数n,a,bの領域は何処に確保されるのでしょうか? 変数cは静的変数用領域に保存される? new演算子で作ったインスタンスはdelete演算子を使わないと消えないと勉強しました。(OSが消さない限り) つまり、上記ではmain関数を抜けても、変数x,y,z,n,a,bの実体は残ると考えてよいのでしょうか? そう考えると、n,a,bの実体はスタックではなく、ヒープ領域に確保する気がします、、 どうか、ご教授ください。

専門家に質問してみよう