- 締切済み
reallocとnew
reallocよりnewの方が優れた部分が多いらしいのでnewを多用するようにしたいのですが、データを保持したままサイズを増やすのはnewでは無理だからreallocよりよい方法はないのでしょうか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
関連するQ&A
- newでrealloc?
最近気になったのはnewをしたものにもう1度newをするとどうなるかです。 例えば class Test *test=new Test[10]; test=new Test[20]; これは極端な場合ですが、一度newで確保した領域にもう一度newで確保すると、realloc的な動作にはなりませんか? 分かる方いましたら教えてもらえるありがたいです。
- ベストアンサー
- C・C++・C#
- reallocについて
reallocでのメモリの割り当てで、 buf = realloc( buf, 1024 ); のように書かれているソースがありますが、この書き方のように reallocの第1引数とreallocの帰り値を受ける変数を同じにすると reallocのエラーに対応できませんよね? それとは別に、buf = (char*)malloc(4);で下図のようになったとすると ×××××××××××××××○○○○× あいうえおかきくけこさしすせそたちつてと その後の buf = realloc( buf, 8 );では、[たちつて]に かぶることなく下図のようになると思います。 三角の部分は丸の部分にデータをコピーするために 完全には開放しないはずですよね。 ×○○○○○○○○××××××△△△△× あいうえおかきくけこさしすせそたちつてと ここからさらにreallocすると、三角だった部分は下図のように reallocによる新しい領域に使われる可能性はありますか? buf = realloc( buf, 9 ); ×△△△△△△△△×○○○○○○○○○× あいうえおかきくけこさしすせそたちつてと 図のひらがなはアドレスを意味しています。 定幅フォントのエディタにコピーして見ていただきたいです。
- ベストアンサー
- C・C++・C#
- 配列のサイズをrealloc的に変更するには?
タイトルの通り配列のサイズを動的に変更することを考えています。 http://www-06.ibm.com/jp/developerworks/java/030808/j_j-dyn0603.html に一発拡張メソッドが載っていますが、私が望むのはCのrealloc的な方法で、メモリ領域を新たに確保して既存データをコピーするのではなく、なるべく利用中のメモリの拡張を試みることは出来るのかという疑問です。 保持するデータはfloat型で、カナリ激しく計算を行います。なのでArrayList<Double> 等による保持方法は考えていません。 Javaでオーバーヘッドが少ない配列の拡張方法ってあるのでしょうか?
- ベストアンサー
- Java
- newを使った領域の動的確保
お世話になります。 C++での記述方法なのですが 構造体Testの領域を確保しておいて値を入れます。 確保しておいた領域では領域が不足するときに 不足分を追加したいのですがどうすればよいでしょう? Cではreallocを使えばよいと思うのですが C++ではmallocではなくnewを使ったほうがよいと聞きました。 newした領域を再定義した場合(deleteせずに領域を追加) 先に領域に入れたデータは保証されるのでしょうか? 以下例文ソース*部分 以下例文のソース Test *a; a = new TEST[10]; int cnt; int i; for(i = 0;i<10;i++){ //ここでTESTの配列aに値を入れる } cnt = 12; if( cnt > 10 ){ //予想サイズを上回ったら足りない分のサイズの領域を確保し //データを入れる a = new[cnt];//*ここで領域を再確保したら元のa[0]~a[9]の //データは確実に保持されるのか? //または他に領域を確保する方法があるのか? } 上記例文ソースでは先にcntで領域を確保すれば良いようにみえますが やりたいことは 先に確保されている領域を広げて 先に入れてあったデータと、広げた領域に入れたデータを使いたい のです。 分かりにくい文章かもしれませんがよろしくお願いします。
- ベストアンサー
- C・C++・C#
- reallocの使い方について
下記コードを実行すると,abendしてしまいます. 本来,alloc_testでは,htmlを取得して戻したい(htmlのサイズは可変)のですが,伸張ができず悩んでおります.ヒント等ご教示いただければ幸いです. また,修正方法の他,何故,下記コードがまずいのかについてもご説明いただければと思います. なお,コメントアウトにもあります通り,配列サイズを十分に大きくとり,reallocの処理を入れないなどの回避方法は望んでいません. //--ここから(全角スペースを使用しています) #include <stdio.h> #include <stdlib.h> int alloc_test(char *c){ char *t; t=(char *)realloc(c, sizeof(char) * 100); if(NULL==t) return -1; c=t; return 0; } int main(void){ char *a="\0"; alloc_test(a); return 0; } //--ここまで よろしくお願いいたします.
- ベストアンサー
- C・C++・C#
- realloc の使い方について教えてください!
http://okwave.jp/qa/q7445404.html で質問した者です。 【1】 あれから試行錯誤して、new と delete を使うことを試みました。まずOnInitDialog()で、サイズが0の 構造体を生成して、prevDataを毎回 delete してから、new してたのですが、UNDOは出来ましたが、REDOが できません。 【2】 ちなみに、前回質問時の m_xcList を(リストコントロールごと)退避して、一個前と 今回のリスト全体を置き換える方法は、outList->DeleteAllItems();の後、どうやっても 復元できないので、やめました。 【3】 今回の質問は、構造体をreallocで、その都度上書きしたい(する方針に変えました)です。 できればメモリーが足りない場合は、エラー処理もしたいと考えています。今は都合上、構造体要素は すべて、String型で定義しています。後で、TCHARに直します。 今の状態は、malloc_Func()が2度呼ばれると「ハンドルされていない例外が発生しました」と でて、止まります。構造体配列のサイズがうまく取れていないと思っています。 →prevData[ItemNo].RepetitionNum = inData; で止まります。 typedef struct any { //int *i; CString RepetitionNum; //ファイル重複識別ナンバー CString Num; //通し番号 CString FullPath; //ファイルパス CString FileName; //ファイル名 CString ApproximateByte; //おおよそのデータサイズ//バイト CString AccurateByte; //実際のデータサイズ//実バイト CString ModifyDate; //修正日 CString ModifyTime; //修正時間 CString RemarksColumn; //備考欄 CString FormatDataStr; //書式情報 //item(): //~item(); }ListItemStruct; ListItemStruct *prevData; ListItemStruct *nowData; ListItemStruct *workData; void malloc_Func(int ItemCount,CString targetName); //このユーザー関数内でreallocしています。 //以下の3つのグローバル変数は、最後の GetItemCount() で取得してINDEXを退避しています。 int LastPrevItemCount; int LastNowItemCount; int LastWorkItemCount; //http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1117611511 //http://blogs.wankuma.com/jitta/archive/2008/12/16/164045.aspx //ユーザー関数内で、分岐して、各ポインターに合わせた処理を行うようになっています。 //一箇所に纏めたかっただけです。 void CFileListCreatorDlg::malloc_Func(int ItemCount,CString targetName){ if (targetName=_T("prevData")){ { int ItemNo = 0; int SubItemNo = 0; int err = 0; ItemNo = 0; while ( ItemNo < ItemCount ) //ItemCount分、構造体配列をreallocします。 { //if( ItemCount == 0 ) {//この↓部分はアプリ起動時一回目にしか実行されないようにOnInitDialog()に記述しました。 // prevData = (ListItemStruct*)malloc(sizeof(ListItemStruct)); // if (prevData == NULL) { return; } //}else{ ListItemStruct* dummy = (ListItemStruct*)realloc(prevData,sizeof(ListItemStruct)*ItemNo+1); if (dummy == NULL) { if (prevData != NULL){ free(prevData); prevData = NULL; } }else{ prevData = dummy; } //} SubItemNo=0; while (SubItemNo<=9){ //if (!err) { CString inData; inData = CString(m_xcList.GetItemText(ItemNo, SubItemNo)); switch (SubItemNo){ case 0: prevData[ItemNo].RepetitionNum = inData; break; case 1: prevData[ItemNo].Num = inData; break; case 2: prevData[ItemNo].FullPath = inData; break; case 3: prevData[ItemNo].FileName = inData; break; case 4: prevData[ItemNo].ApproximateByte = inData; break; case 5: prevData[ItemNo].AccurateByte = inData; break; case 6: prevData[ItemNo].ModifyDate = inData; break; case 7: prevData[ItemNo].ModifyTime = inData; break; case 8: prevData[ItemNo].RemarksColumn = inData; break; case 9: prevData[ItemNo].FormatDataStr = inData; break; } CFileListCreatorDlg::StatusStringSet(_T("UNDOデータ 退避中"),0,FALSE);//ダイアログ上のテキストに状態を記しています。 } SubItemNo++; } ItemNo++; } } } プログラムが終わるときに解放しています。 free(prevData); prevData = NULL; free(nowData); nowData = NULL; free(workData); workData = NULL; 参考書も見てみたのですが、分かりません。まずは一応動く程度でも構いませんので、 教えてくださると嬉しいです。宜しくお願いします。
- ベストアンサー
- C・C++・C#
- reallocでメモリを再確保するには?
こんにちわ, 今, 「すでに動的確保しているメモリをその型分1サイズだけ増やす」というプログラムを考えています。 具体的には, char* str_p; a=calloc(str_p, sizeof(char)); /*ここから問題のプログラム(実際はずっと動くので無理です*/ while(1) { a=realloc(str_p, sizeof(str_p)+sizeof(char)); } ・・・・・・ これだと,私的にはsizeof(str_p)で今のサイズを調べ,それにsizeof(char)を加えることで次々に1サイズ大きいメモリを再確保できると思ったのですが,ポインタのサイズを指していてそれにchar型のサイズをたしていていつも固定サイズになるみたいでうまくいきません。 どうすれば,char*などポインタ型の変数の大きさを調べられるのでしょうか。 また,どうすれば,1サイズずつ大きくできるのでしょうか。 よろしくおねがいします。
- ベストアンサー
- C・C++・C#
- new型の戻り値? new型のパラメータ?
あらゆる応用が利くC++ではあるのですが、それによってひとつのやり方にも複数の方法が出てくるのはよくあること。そこで、new型のポインタにおいて戻り値として返せばいいのか、パラメータとして使えばいいのか悩んでおります。 [1] wchar_t *XXX(int size){ wchar_t *ret = new wchar_t[size] //ポインタに対するいろいろな制御 return ret; } ↑このように、関数内部でnew型ポインタを宣言し、そのポインタのアドレスを外部のポインタに渡す。 [2] static wchar_t ret = new wchar_t; -------- void XXX(wchar_t *ret, int size){ //ポインタに対するいろいろな制御 } ↑関数を呼ぶ手前ですでにnew型ポインタを宣言しておく [1]のほうが、宣言をする手間を省くことができるような気がしますが、new型ポインタがいらなくなったときにdeleteするのをわすれてしまったりということが起きるかもしれないということも考えてしまい、どちらをがメジャーなのかよくわかりません。 皆様ならどういった方法をとりますか? また別な方法がありましたが教えてくださるとありがたいです。
- ベストアンサー
- C・C++・C#
- 一度newしたものを取り消すには?
一度newしたものを取り消すには? AS3初心者です。 オリジナルクラス( DataReader とします)を作りました。 ボタンを押す度に、new DataReader() されて、 毎回同じ表示エリアに DataReader の処理内容が表示されます。 その際、前に押されたときに new DataReader() された 処理内容を取り除きたいのですが どうすればいいかわかりません。 どうすればいいのかわからないので、現状は ボタンが押されるたびに new DataReader() でaddChildされた処理内容を 1つ1つremoveChildしていってます。 その後に新たに new DataReader() しています。 ただ、これだととても非効率な書き方な気がしていて、 実際に何度もボタンを押すと、 どこかに消されていないデータが蓄積していっているのか 処理速度が落ちてきます。。 一度newしたものを取り消す、別の方法はありますでしょうか? (= newしたときに実行されたコンストラクタの内容をそのまま取り消す) どなたかご存知の方いらっしゃいましたら、 どうかよろしくお願いいたします。
- ベストアンサー
- Flash
- reallocとstrtokの併用について
fscanfで文字列を読み込み、strtokでカンマ区切りにするという関数を作りたいのですが、 reallocすると先頭から徐々にデータが文字化けしていきます。 まず最初に4つ分のchar*を取ります。 もし、5つ目が見つかったらさらに4つ増やし、9つ目が見つかったらさらに。。。というようになっております。 n個目の判定はcntがn-1で真になり、reallocが成功したら個数を増やすようになってます。 5つ目が見つかった時点では出力に問題は無いのですが、6個目から侵食が始まっていきます。 原因がどうしても自分では分からなかったので、誰かお願い致します。 words.txtの内容(末尾改行なし) iii,jjj,kkkkkkkkk,l,m,n,ooooo,pppppppp,a,s,d,f,g main.c #include<stdio.h> #include<stdlib.h> #include<string.h> #include"C:\borland\bcc55\Include\malloc.h" int readlinefile(FILE *fp,char **words){ int cnt=0,len; char *line=(char *)malloc(256); char *tmp; if(line==NULL) return 0; if(fscanf(fp,"%s",line)!=EOF){ if((tmp=(char *)realloc(line,sizeof(char)*(strlen(line)+1)))==NULL){//できるだけメモリを節約してみる return 0; }else{ line=tmp; } len=strlen(line); printf("line:%d:%d:%s\n",len,_msize(line),line); if(len>1){//ファイル終端の改行を排除 int i; char *tok=strtok(line,",");//カンマで区切ったアドレスを得る while(tok){ if(cnt==0)printf("tok:1st:%x\n",tok); if(cnt>3&&cnt%4==0){//サイズが足りなくなった時 char **tmp2; if((tmp2=(char **)realloc(words,sizeof(char *)*(4+4*(cnt%4))))==NULL){ printf("words realloc ERROR\n"); break; }else{ printf("realloc\n"); words=tmp2;//reallocを適用 } } words[cnt]=tok; if(cnt){ printf("line(func)"); for(i=0;i<len+1;i++){ printf("%c",words[0][i]); } printf("\n"); } tok=strtok(NULL,","); printf("words[%d]:%x:%s\n",cnt,words[cnt],words[cnt]); printf("\n"); printf("tok:%d回目:%x\n",cnt+1,tok); cnt++; } return cnt;//正常終了した }else{ free(line); } } return 0; } int main(){ FILE *fp=fopen("words.txt","r"); if(fp){ int cnt=1; while(cnt){ int i; char **words=(char **)malloc(sizeof(char *)*4); words[0]=NULL; cnt=readlinefile(fp,words); printf("mainに戻りました\n"); if(cnt) printf("words:%d\n",cnt); for(i=0;i<cnt;i++){ printf("words[%d]:%x:%s\n",i,words[i],words[i]); } free(words[0]); words[0]=NULL; printf("\n"); free(words); } }else{ printf("file open ERROR\n"); } return 0; } 実行結果 なぜかコピペできないので実行するか斧でダウンロードお願いします。 http://www1.axfc.net/u/3352789.txt 全てまとめたもの http://www1.axfc.net/u/3352796.zip
- ベストアンサー
- C・C++・C#
お礼
vectorが使えそうですね。 知らなかったので勉強してみます。 ありがとうございました。