template引数の一致 – プログラミング – Home

通知
すべてクリア

[解決済] template引数の一致


壱
 壱
(@壱)
ゲスト
結合: 14年前
投稿: 9
Topic starter  

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
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

あるかないかということなら、無いっす。
ポインタは、指す先に何個の実体があるかは保持していないので。

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

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


返信引用
hirocco
 hirocco
(@hirocco)
ゲスト
結合: 14年前
投稿: 138
 

組み込みでメモリの都合上で仕方なく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
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

生でポインタなど使わずに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の
ような?)近しい機能を独自拡張で提供している可能性もあるとは思います。
返ってくる値が「要求時のサイズ」なのか「実際に割り当たったサイズ」なのかも
仕様によるかと思いますし、特定の処理系に激しく依存するので(用途次第でしょうが)
イケテナイですが。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 14年前
投稿: 40
 

こんなのもアリかと。

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


返信引用
壱
 壱
(@壱)
ゲスト
結合: 14年前
投稿: 9
Topic starter  

皆様、ご丁寧な説明ありがとうございます。
またアプローチの仕方も提案してくださって申し訳ないです。
STLを積極的に使っていこうと思います。
ありがとうございました!


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました