以前の有効な回答を完了するために、回答を拡張しようとします。
私はそれを正しくしましたか?
さて、関数間でデータを渡すために: はい、ポインターを使用してそれを行うことはオプションです。しかし、メモリ管理が面倒になるため、コミュニティでは一般的に推奨されていません。
動的メモリを指すポインターを使用する場合、メモリが作成される場所とメモリが削除される場所の明確なイメージを持っている必要があります。つまり、メモリのライフサイクルは明確かつ単純でなければならず、この理由から、関数間でポインタを渡すことは一般的に推奨されません。
たとえば、あなたの場合:unsigned int* step1(...)
関数はポインターを返しますが、それを見ると、新しいプログラマーまたはあなたと一緒に働く人は、返されたポインターが動的メモリであるかどうか、および step1 を呼び出す必要があるかどうか、delete
またはdelete []
呼び出し後のメモリが同じであるかどうかわかりません。誰かがunsigned char* step2(unsigned int* savedData, ...)
尋ねるので、より混乱し、面倒になるでしょう:渡されstep2
たものを変更しますか?savedData
この問題を解決するにはstep2
、関数を次のように変更します。
unsigned char* step2(const unsigned int* const savedData, ...)
を追加することで、const
「ねえ!step2
の内容をsavedData
変更したり、それが指しているアドレスを変更したりするつもりはない」.
しかし、最も重要な問題を解決していないため、前のテキストはすべて役に立ちません: メモリはどこで解放されますか?
step1
あなたはメモリを動的に作成していますが、このstep2
メモリは読み込まれますが...delete
貼り付けていないコードのどこかに隠されていますか? またはstep3
メモリの世話を待っていますか?
このメモリの頭痛の種をすべて回避するために、一般的に、 のような STL コンテナの使用が推奨std::vector
されます。この場合、コンテナがメモリ管理を処理します。
typedef std::vector<int> intvector;
typedef std::vector<intvector> intintvector;
void step1(intintvector &Data, ...) {
...
// create data arrays
intvector data0, data1, data2, data3;
// fill data0, data1, data2, data3
// ...
// save data arrays.
Data.push_back(data0);
Data.push_back(data1);
Data.push_back(data2);
Data.push_back(data3);
}
void step2(const intintvector &savedData, ...) {
// read data arrays
intvector data0 = savedData[0];
intvector data1 = savedData[1];
intvector data2 = savedData[2];
intvector data3 = savedData[3];
// ...
}
簡単な要約: 動的メモリを処理しないと、ポインター部分を正しく使用していないため、この問題を修正するか、STL コンテナーに委任する必要があります。
それが役に立てば幸い!:D