template引数の一致

[戻る]
2011/02/19(土) 09:03:45
WindowsXP(SP3) VC++2008使ってます。 
c++初心者です。

ttp://msdn.microsoft.com/ja-jp/library/cc440189(VS.71).aspx
ここの論文を読んだのですが、
配列newなどのコンパイル時に配列サイズが定数でないものは、
後からサイズを知る方法というものはないのでしょうか。
int* f(){
    int size = ごにょごにょ
    int* p = new int[ size ];
    return p;
}
このとき戻り値のポインタを使ってsizeを知る方法があるのかなと思いました。
よろしくお願いします。

tetrapod 2011/02/19(土) 22:43:10
あるかないかということなら、無いっす。
ポインタは、指す先に何個の実体があるかは保持していないので。

static int aaa[1000];
int* g() { return &a[123]; }
とかあった場合に「サイズとは?」という話にもなるわけで。

素直に vector でも使っておくのが無難と思われる。

hirocco 2011/02/19(土) 22:52:29
組み込みでメモリの都合上で仕方なくmallocを自前で実装したことがありましたけど,
解放時にはそれは何バイト解放するんでしょうという問題で確保するポインタの前側に
ヘッダを設けましたねぇ,そのヘッダには色々な確保時のデータを記録して利用できるよ
うにしてましたけどね
本物のアロケートにも似たような構造になっているはずでしょうからねぇ
絶対無理か?と聞かれれば絶対無理ではないと答えるんでしょうけど,

一般的には絶対無理としておくのがいいと思います

>int* f(){
>    int size = ごにょごにょ
>    int* p = new int[ size ];
>    return p;
>}

int f(int** lplpNewAllocate){
    int size = ごにょごにょ
    int* p = new int[ size ];
    return size ;
}
とかにしちゃって,サイズを戻り値にってのはどうでしょう?

Ban 2011/02/19(土) 22:57:15
生でポインタなど使わずにvectorを使う。貰うときもvectorでもらう。

std::vector<int> f() {
    int size = ごにょごにょ
    std::vector<int> p(size);
    return p;
}

C++専用ならこれで充分だと思うし、C言語との互換性などもあるので、
生のポインタでできる汎用の方法はないはず。

そもそも生のポインタを使うとメモリ管理が煩雑になりますし、
std::vector<int> buf;の先頭ポインタは &buf[0];で取れます。
勿論サイズもbuf.size()で取れますから、せっかくC++ならこれでよいのでは。

どうしても欲しければ、::operator new[]などを用いて、
「自分でそういう情報を保持管理する」ようにはできるかと思いますが、
デバッグ版ライブラリがメモリチェック用にやるような代物であって、
作る手間とオーバヘッドを考えてもメリットはなさそうな。


また、環境依存の方法なら、(動作上内部では情報を持つでしょうから)コンパイラの
ランタイム内から内部管理情報の取得はしうるかと。(例えばWin32のHeapSizeの
ような?)近しい機能を独自拡張で提供している可能性もあるとは思います。
返ってくる値が「要求時のサイズ」なのか「実際に割り当たったサイズ」なのかも
仕様によるかと思いますし、特定の処理系に激しく依存するので(用途次第でしょうが)
イケテナイですが。

επιστημη [E-Mail] [HomePage] 2011/02/20(日) 00:35:55
こんなのもアリかと。

pair<int*,int> f() {
  int* p = new int[N];
  return pair<int*,int>(p,N);
}

2011/02/20(日) 04:11:15
[[解決]]
皆様、ご丁寧な説明ありがとうございます。
またアプローチの仕方も提案してくださって申し訳ないです。
STLを積極的に使っていこうと思います。
ありがとうございました!

古いスレッドには追加発言できません。