new

new.png

List of pages tagged with new:

なぜ関数の引数として渡したポインタをnewで確保できないのか?

たとえば、ファイルを読み込む便利関数を作ろうと思ったとき
ポインタを渡して、関数の中でメモリ確保してもらおうっと思ったけど、できない!

void Alloc(int* _data){
_data=new int[100];//これは効き目ない。
}
void main(){
int* pt;
Alloc(pt);//ptのメモリ領域は確保されない。
}

なぜだめなのか?これは普通の変数でいうところのこうしてるのと同じことだからだ
void Func(int _a){ printf("a=%d",_a);}
void main(){
 int b=1;
Function(b);
}

うまくいく方法

void Alloc(int** _data){
*_data=new int[100];
}
 
void main(){
   int* pt;
   Alloc(&pt);
}

あるいはこれ
void Alloc(int*& _data){
_data=new int[100];
}
 
void main(){
   int* pt;
   Alloc(pt);
}

前者がおすすめ。なぜなら、関数を使うときに、関数の中で何かされちゃうんだってわかるから。
あの、わけわからない2重ポインタにすればうまくいくってわけ。たしかにそういうライブラリあるよね。
OpenCVかなにかだったかな。
でもGLFWではそんな面倒くさい引数じゃなかった。もっと良い方法があるはず。

31項:関数はローカルオブジェクトへのリファレンスや関数の中でnewで初期化したポインタの参照先を返してはならない

Effective C++より。

サポートサイト Wikidot.com