はじめまして。
このたび仕事でとあるオンラインシステムのデータベースを、
夜中にバッチ更新するプログラムをVC6.0SP5で作成しました。
このプログラムはWIN2000上で動かすwin32concoleアプリケーションで、
main()の中で実際の処理を行うクラスオブジェクトを作成して処理を行います。
こんな感じです。
int main(){
doClass obj;
obj.Execute();
return 0;
}
Execute()以下で、SQLを文字列として作成してクラスの中で発行していくのですが、
sprintfでSQLを組み立てる際に必要な文字列領域をクラスの中で次のように取って
使いまわししています。
class doClass{
private char m_sqlbuf[2048];
...
SQL文字列が2048のサイズを超えることはないので、このようにしたのですが、
(必要になったときに必要なだけヒープに領域をとる方法は、テスト期間が限られて
いて、失敗した場合をチェックしきれないと思ったので)
ここで、ちょっと教えていただきたいのですが、こういうやり方は危険でしょうか?
もしくは普通はしない、などありましたら今後のためにも教えていただきたいのです
が。 ちなみにですが、このdoClassは常にというかひとつしか生成されません。
長文失礼いたしました。それと分かりにくいタイトルもお許し下さい。
>doClassは常にというかひとつしか生成されません。
この条件なら問題ないと思います。
あくまで条件を厳守するなら。
文字列ならstd::stringの方がよくない
>doClassは常にというかひとつしか生成されません。
非staticメンバなので、インスタンスがいくつ出来るかは関係ありません。
問題が起こるとすれば、
・同一のインスタンスに対して複数スレッドから同時にメンバ関数を呼び出す
・あるm_sqlbufを使うメンバ関数内から、別のm_sqlbufを使うメンバ関数を呼び出し、
呼び出し側はm_sqlbufの中身が変わっていると思わずアクセスしてしまう
といった場合でしょうか。
ローカル変数で良いのでは?
回答をくださったみなさんありがとうございます。
とくに問題がなさそうなので安心しました。
>文字列ならstd::stringの方がよくない
sprintf(m_sqlbuf, SELECT * FROM %s, TABLE01);
のように使用しています。std::stringでこのような書式指定のやり方が
わからなかったもので。^^;
参考までにこんなのがあります。
#include <iostream> //cout
#include <sstream> //ostringstream
#include <iomanip> //setw,setfill
int main()
{
using namespace std;
for(int i=0; i<10; ++i){
ostringstream ost;
ost<<test<<setw(2)<<setfill('0')<<i<<.txt;
cout<<
ost.str() //stringを返す
<<endl;
}
return 0;
}
>非staticメンバなので、インスタンスがいくつ出来るかは関係ありません。
関係なくはないでしょう。
先を見てない素人発言です。
>関係なくはないでしょう。
なぜ? スタック領域の大きさとか?
> 関係なくはないでしょう。
具体的にはどのような危険性があるのでしょうか?
インスタンスをたくさん作ると
実際には使っていないのに多数の配列メモリが
占有されたままになってしまうというような事ですか?