C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: 動的メモリ確保について


(過去ログ 57 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■32599 / inTopicNo.1)  動的メモリ確保について
  
□投稿者/ お飾り平社員 (1回)-(2009/02/10(Tue) 15:52:00)

分類:[C/C++] 

よろしくお願いします。

VC++(2008)初心者です。

ただ今、Windowsアプリを作成しています。
その中で、char型のポインタが指すある値を書き換えるという処理があります。
その為、値の変更時にメモリを動的に変更したいのですが、どうすればいいのかわからず困っています。

char *aaa;

int i = 3;

aaa = new char[i];

aaa = "xyz";

aaa = "vwxyz"; ←実現したいこと

delete[] aaa;

但し、"vwxyz"の部分は変更時までわからないとした場合です。

よろしくお願いします。
引用返信 編集キー/
■32600 / inTopicNo.2)  Re[1]: 動的メモリ確保について
□投稿者/ επιστημη (1697回)-(2009/02/10(Tue) 15:59:38)
επιστημη さんの Web サイト
2009/02/10(Tue) 16:06:17 編集(投稿者)

> char *aaa;
> int i = 3;
> aaa = new char[i];

(1) 3文字分の領域確保したわけね。

> aaa = "xyz";

(2) ここでいきなりマチガイ。(1)で取った領域が迷子になってます。

> aaa = "vwxyz"; ←実現したいこと

(3) なのでこれもマチガイ

> delete[] aaa;

(4) 何をかいわんや

> よろしくお願いします。

std::string使いましょう。

引用返信 編集キー/
■32602 / inTopicNo.3)  Re[1]: 動的メモリ確保について
□投稿者/ .SHO (667回)-(2009/02/10(Tue) 16:58:11)
No32599 (お飾り平社員 さん) に返信

> aaa = "vwxyz"; ←実現したいこと
> 但し、"vwxyz"の部分は変更時までわからないとした場合です。

わかった時にメモリを確保しましょう。

引用返信 編集キー/
■32605 / inTopicNo.4)  Re[2]: 動的メモリ確保について
□投稿者/ お飾り平社員 (2回)-(2009/02/10(Tue) 17:25:42)
お返事有難うございます。

すいません、間違えてましたか。
確かにstringが楽なんですが、何かとcharが登場するシステムなものですから。
stringだと処理が遅い気がするし。

一度deleteしない限り、メモリの再取得って出来ないんでしょうか?
都合に合わせてサイズを変えたい場合(文字の追加など)、皆さんどうしてますか?
やっぱりstringにコピーするしかないのでしょうか?
同じ文字列をいちいちコピーするっていうのも素人心にメモリの無駄遣いな気がしなくもないのですが。
引用返信 編集キー/
■32606 / inTopicNo.5)  Re[3]: 動的メモリ確保について
□投稿者/ επιστημη (1698回)-(2009/02/10(Tue) 17:32:51)
επιστημη さんの Web サイト
2009/02/10(Tue) 17:37:59 編集(投稿者)

> 確かにstringが楽なんですが、何かとcharが登場するシステムなものですから。

だから...何ですか?

> stringだと処理が遅い気がするし。

気がするだけですか? 実際遅いですか? 確認しましたか?

> 一度deleteしない限り、メモリの再取得って出来ないんでしょうか?

やってもかまいませんよ。"返し忘れ"/"返し過ぎ"さえなければ。

> 都合に合わせてサイズを変えたい場合(文字の追加など)、皆さんどうしてますか?
> やっぱりstringにコピーするしかないのでしょうか?

やり方はいくつもあるけど結局stringがいちばん楽じゃないかしら。

# char*/char[] を文字列として使っているならstringですが、
# バイト列としてなら vector<char> 使うかも。

引用返信 編集キー/
■32609 / inTopicNo.6)  Re[4]: 動的メモリ確保について
□投稿者/ Blue (5回)-(2009/02/10(Tue) 17:41:30)
_strdupあたりは使えませんか?
http://msdn.microsoft.com/ja-jp/library/y471khhc.aspx
(malloc <-> freeの関係ですが。)
引用返信 編集キー/
■32610 / inTopicNo.7)  Re[5]: 動的メモリ確保について
□投稿者/ επιστημη (1699回)-(2009/02/10(Tue) 17:45:39)
επιστημη さんの Web サイト
2009/02/10(Tue) 17:58:12 編集(投稿者)
> _strdupあたりは使えませんか?

C++だとここだけfree使わんならんできしょいんですよねー ^^;;;

テケトーなクラスこさえて茶を濁してもいいかも。

class charbuf {
public:
  char* body;
  charbuf() : body(0) {}
 ~charbuf() { free(body); }
  char* assign(const char* s) {
    if ( !body || strlen(body) < strlen(s) ) {
      free(body);
      body = _strdup(s);
    } else {
      strcpy(body,s);
    }
    return body;
  }
}

とかなんとか。

引用返信 編集キー/
■32616 / inTopicNo.8)  Re[3]: 動的メモリ確保について
□投稿者/ 倉田 有大 (435回)-(2009/02/10(Tue) 21:54:29)
> すいません、間違えてましたか。
> 確かにstringが楽なんですが、何かとcharが登場するシステムなものですから。
> stringだと処理が遅い気がするし。

元コードの書き方に合わせますね僕なら。
混在しているのなら楽なstringを使い倒します。

楽→ソースが簡潔→バグも少なくなる→改良も簡単→仕事はかどって給料増える→早く帰れる

いいことばっかり!

> 一度deleteしない限り、メモリの再取得って出来ないんでしょうか?
> 都合に合わせてサイズを変えたい場合(文字の追加など)、皆さんどうしてますか?
> やっぱりstringにコピーするしかないのでしょうか?

文字列にかかわらず、メモリーの取得、解放はCの基礎なので、がんばって勉強しませうー

> 同じ文字列をいちいちコピーするっていうのも素人心にメモリの無駄遣いな気がしなくもないのですが。

stringでいいでんがな。
めっちゃ早い処理が必要なら、自分でクラス作るとかすればいいと思います。
引用返信 編集キー/
■32620 / inTopicNo.9)  Re[1]: 動的メモリ確保について
□投稿者/ C勉強中 (1回)-(2009/02/10(Tue) 22:19:41)
No32599 (お飾り平社員 さん) に返信

質問の意味が理解できないので教えてください。


> その中で、char型のポインタが指すある値を書き換えるという処理があります。

これは char型のポインタが指すアドレスを先頭とする文字列を変更するということで
先頭アドレスは変更してはいけないということですか?


> その為、値の変更時にメモリを動的に変更したいのですが、どうすればいいのかわからず困っています。
>

普通、動的に変更すると返されるアドレスは変更されます。

したがって上記2項目は両立しません。


char型のポインタが指すアドレスが変わってよいのなら

char *aaa;
aaa = "abc";
aaa = "abcde";

でも良い。




引用返信 編集キー/
■32621 / inTopicNo.10)  Re[4]: 動的メモリ確保について
□投稿者/ nori (48回)-(2009/02/10(Tue) 22:22:45)
char *aaa;
aaa = new char[3+1];
strcpy(aaa, ""xyz");
delete[] aaa;

aaa = new char[5+1];
strcpy(aaa, ""vwxyz");
delete[] aaa;

# strcpy_sの方を使った方が良いけど。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -