[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 04/01 07:48 / Filesize : 131 KB / Number-of Response : 559
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.57【環境依存OK】



1 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 22:39:18 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.56【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1215278693/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。

461 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:37:48 ]
DirectX=3Dじゃないと思うんだけど

462 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:38:01 ]
>>457 >>458 >>459 >>460
アドバイスありがとうございます。
この夏休みでDirectXの基本をマスターして3Dゲームが作れるようにがんばります。

463 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:38:45 ]
>>461
そうなんですか?
勘違いしていたみたいです・・。
もう少し調べてみます。

464 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:43:38 ]
>>461
DirectXの描画は基本3Dじゃなかったっけ

465 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:47:03 ]
Drawが葬られたからね。

466 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:48:25 ]
実はDirectSoundだけ使いたい・・・なんてことはないか

467 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 14:49:42 ]
>>464-465
そうだった
昔2D描画用のがあったんだけどもうなくなったんだね
あれ結構評判良かったのに

468 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:02:03 ]
今でもDirectDrawは使えるし、地味にアップデートもされてる(もうされないだろうけど)
ドキュメントが無くなったけどな

469 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:38:04 ]
引数←読み方インスウだと思ってたけど
ヒキスウって最近知った



470 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:48:16 ]
returnされる値は
カエリチ?ヘンチ?

471 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:48:56 ]
返り血

472 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:53:39 ]
>>469
どーぞくハケーン

473 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:54:36 ]
独学でやってたってことかな
授業とかでやったら確実に発音するでしょ

474 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 16:58:05 ]
>>470
俺はモドリチ

475 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 17:00:15 ]
普通、戻り値だよな

476 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 17:03:54 ]
オレも返り値は返り血に聞こえるから戻り値

477 名前:デフォルトの名無しさん [2008/07/28(月) 17:05:45 ]
リターンチだろ

478 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 17:07:41 ]
どれも同じだ

479 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 17:12:31 ]
スタックの血を浴びて 〜社会不適応者のデスマーチ奮闘記〜



480 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 17:37:50 ]
新ジャンル:仕事人間サスペンスホラー

481 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 20:39:33 ]
ああ、よく考えたら俺も戻り血だったわ。

482 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 20:52:11 ]
オレは「戻り値として0を返す」とかいう。
でも「返り値として0を戻す」はいったことないな。

483 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 21:21:23 ]
俺は「返り値として」には違和感がある
返り値を使うなら「返り値をaに戻す/返す/当てる」とかは言う
返り値の値に言及する時は思いつかない

484 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 00:56:44 ]
const std::string& GeRefOfFuncStaticString(int n)
{
  static std::string str = boost::lexical_cast<std::string>(n);
  return str;
}

const std::string g_strNotFound("NotFound");

const std::string& GeRefOfFuncStaticString2(int n)
{
  static std::map<int,std::string> mapStr;
  if( mapStr.empty() )
  {
    mapStr.insert( std::make_pair(100, "100") );
    mapStr.insert( std::make_pair(101, "101") );
  }

  std::map<int,std::string>::const_iterator itrFound = mapStr.find(n);
  return itrFound != mapStr.end() ? itrFound->second : g_strNotFound;
}

int _tmain(int argc, _TCHAR* argv[])
{
  std::cout << GeRefOfFuncStaticString( 100 ) << std::endl; // 表示: 100
  std::cout << GeRefOfFuncStaticString( 101 ) << std::endl; // 表示: 100 ← 関数内の static 変数の参照を取り出せない
  std::cout << GeRefOfFuncStaticString2( 100 ) << std::endl; // 表示: 100
  std::cout << GeRefOfFuncStaticString2( 101 ) << std::endl; // 表示: 101
  return 0;
}

 map を使った場合の GeRefOfFuncStaticString2( ) は意図した動作になるんですが,たまたまでしょうか?

485 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 01:24:05 ]
>std::cout << GeRefOfFuncStaticString( 101 ) << std::endl; // 表示: 100 ← 関数内の static 変数の参照を取り出せない

関数内のstatic変数の参照を取り出してますよ。

486 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 01:43:11 ]
>>485 解答ありがとうございます.恥ずかしながら static に関してすごい勘違いをしていたようです.
 初期化が一度しか行われないんですね.以下のようにして GeRefOfFuncStaticString() でも望みどおりの
動作が出来るようになりました.
 有難うございました.

const std::string& GeRefOfFuncStaticString(int n)
{
  static std::string str;
  str = boost::lexical_cast<std::string>(n);
  return str;
}


487 名前:デフォルトの名無しさん [2008/07/29(火) 03:24:06 ]
a

488 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 07:50:00 ]
static変数が緊急対応以外で必要になったときは設計ミス。

489 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 08:06:38 ]
何故static変数にいちいち保存しているのかが謎。



490 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 09:24:49 ]
便乗質問なんだけど

const std::string& GeRefOfFuncStaticString(int n)
{
  static std::string str = boost::lexical_cast<std::string>(n);
  return str;
}

これ static のところ、いつ初期化されるんだ? 今までプログラム
起動時(main以前)だと思ってたんだが、nが関数の呼び出し時に
決まるじゃん。

内部で
if(関数の初回呼び出しなら){
  str = boost::lexical_cast<std::string>(n);
}

みたいなコードにコンパイルされるわけ?
>>484の挙動見ているとそう見えるんだが…

491 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 09:36:58 ]
>>490
それであってる。
ちなみに初期化についてスレッドセーフである保証は無いので、
マルチスレッドのプログラムで排他せずにstatic変数使ったら、
いつ異常動作してもおかしくない。

492 名前:デフォルトの名無しさん [2008/07/29(火) 10:07:55 ]
標準ライブラリのメンバ関数までが詳細に載ってるページってありますか?
探したけど俺の目が悪いんだろうか、見つかりません;;
だれか教えてください

もしくは、この質問に答えてください。

istringstreamのオブジェクトに、文字列を代入(?)するとき、
istringstream is(string("abc"));
のように初期化ではなくて、あとから代入することはできますか?
やり方を教えてください。

493 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:18:55 ]
>>491
いつの間にそうなったんだ…

関数呼び出し時に初回判定が入るんじゃあパフォーマンス
に悪影響があるだろうが。

func(){
static int a = 100;
}

は昔どおり初回判定なんか入らないよな?

494 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:34:42 ]
>>493
昔から変わってないよ。その int の例でも、関数内で値の変更があったり、
ポインタや参照を外に渡してしまっている場合は初回判定が必要になるでしょ。

495 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:35:44 ]
昔どおりも何も、単に最適化で判定が消えてるだけだろ

496 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:37:38 ]
>>495>>493

497 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:38:57 ]
>>492
istringstream ではなくて stringstream を使ってみては?

498 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:41:57 ]
>>492
www.cppreference.com/
www.cppll.jp/cppreference/
msdn.microsoft.com/ja-jp/library/cscc687y.aspx

is.str("abc");

499 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 10:42:21 ]
定数での初期化なら、初回実行時でなくmainの前にされたりするよ。
その辺の最適化は処理系定義。

引数で初期化したら、まず確実に判定が入る。



500 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:07:28 ]
std::wofstreamを使ってテキストに書き込む時自動的にファイルの
頭にBOMを追加してくるみたいなものって存在しますか?

自分で先に書くのが普通でしょうか?

自分でFF FE をファイルと開いて書き込んでから
wofstreamを使うと先に書き込んだ2バイトが消されてしまい途方にくれて
おります・・・・

501 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:09:44 ]
自分で先に書くのが普通。

502 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:22:18 ]
std:ios::app だっけ?

503 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:22:48 ]
>>499
つまり、関数内のstatic変数の初期値が定数じゃない限り、初回確認用のフラグもstatic領域に用意されるわけだな。

504 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:36:53 ]
>>501-502
std:ios::appでBOMが残せましたmありがとうございます!

505 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:43:28 ]
>>494
一連のレスは理解できるのだが、

> int の例でも、関数内で値の変更があったり、
>ポインタや参照を外に渡してしまっている場合は初回判定が必要

これが分からん。

プログラムロード時にaが100になるでしょ。それで、関数内で
値の変更があったり、 ポインタや参照を外に渡してしまっている
場合はどうして初回判定が必要になるの?

506 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 11:48:26 ]
>>505
例えばこんなケース。

int func(int n)
{
static int a = n;
return a;
}

int main()
{
for (int a = 2; a <= 5; ++a) {
printf("%d, %d\n", a, func(a));
}
return 0;
}

507 名前:494 mailto:sage [2008/07/29(火) 12:23:54 ]
>>505
変数宣言通過時に初期化されるんなら初回判定が必要かと思ったんだけど、
プログラム起動時に初期化してもいいみたい。

ってことで >494 は間違いで、初回判定が必要になるのは初期値が定数式じゃないときね。


ごめんよ >>506

508 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 14:13:54 ]
横から失礼します
ファイル中のN個の値で、配列a[N]を作りたいんですが
うまいやり方が思いつかないので、どなたか教えていただけませんか?

509 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 14:15:51 ]
>>508
mallocの使い方を聞いてるのか?



510 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 14:19:20 ]
malloc( new? ) を使えば出来るんですね。やってみます。


511 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 16:37:39 ]
std::vector<型> a(N);でもよいぞ

512 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 18:48:40 ]
ワイマール憲法を構造体で記述せよ
という夏休みの課題が出たのですが、何から始めていいかさっぱりわかりません・・・・。
だれか御助けを・・・・。

513 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 18:49:31 ]
イクイク、ワイマール憲法

514 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 19:32:11 ]
struct kenpoo {
int Y;
int O;
};

515 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 20:45:26 ]
>>512
残念ですが、その課題を出した先生は脳に異常をきたしています・・・。
まともな対話は不可能でしょう。課題の提出は諦めるほかないでしょう。

516 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 21:39:36 ]
みんなイクイク、ベルサイユ条約

517 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 22:07:51 ]
ああ、1919か

518 名前:デフォルトの名無しさん [2008/07/29(火) 22:26:11 ]
class hoge{
private:
std::list<int> foo;
public:
void setfoo(std::list<int> foo){
this->foo.clear();
std::list<int>::iterator itr;
for(itr=foo.begin();itr!=foo.end();itr++)
this->foo.push_back(*itr);
}
std::list<int> getfoo() const{
return foo;
}
};

int main(){
hoge hoge0;
std::list<hoge> hogehoge;

std::list<int> tmp;
tmp.push_back(1);
tmp.push_back(2);
hoge0.setfoo(tmp);
std::list<int>::iterator tmpitr = hoge0.getfoo().begin();
hogehoge.push_back(hoge0);
std::list<int>::iterator itr = (*hogehoge.begin()).getfoo().begin();
std::cout << *itr << "," << *(++itr);
}
このコードで、最後に"1,2"と表示されて欲しいところが、"0,0"となってしまいます。
どこが悪いのかがわからず困っています。よろしければ教えていただけないでしょうか…。

519 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 22:30:32 ]
ほう、それがワイマール憲法か。なるほど



520 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 22:34:42 ]
getfooの戻り値であるhoge::fooの一時コピーが次の文に移る間までに破棄されてしまうからと、
ひとつの式の中でitrを代入と参照の両方してるから

521 名前:518 [2008/07/29(火) 23:03:49 ]
>>520
ありがとうございます。
最後にcoutするところで、itrが無効化してしまってるということでしょうか。
一時コピーが破棄されるタイミングがイマイチわかりません。
たびたびすいません…。

522 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 23:15:52 ]
>>521
完全式の終わりで破棄される

523 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 23:39:25 ]
だれか、C++のえろい人
百聞は一見にしかずだから
>>518のコードを希望通りに動くように修正汁!

すまん、俺C++わからんから><

524 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 23:44:32 ]
getfoo()の戻り値を参照型に換えたら?

525 名前:デフォルトの名無しさん [2008/07/30(水) 00:02:27 ]
C言語勉強のためにプログラムを作成しました。
が、printf("hello")の時点で壁にぶちあたりました。
正しくコードを入れたはずですが、実行して表示されるのは、
2chアップローダ:www-2ch.net:8080/up/download/1217343270379299.ZNkHRl
です。exeと、badが同時に出現するのは何故?さらHELLOが表示されていないのは何故?
「苦しんで覚えるC言語」を参考にやってみたのですが、いきなり苦しいです。
神様助けてください。。。
コンパイラ:Borland C++ Compiler
エディタ:CPad for Borland C++Compiler

526 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:17:17 ]
さらに
std::cout << *itr << ",";
std::cout << *++itr;
と二行に分けると動く。

その理由は、((std::cout.operator<<(*itr)).operator<<(",")).operator<<(*++itr)
というようにちょっと考えるとインクリメント演算子は後から適用されるように思えるが、
インクリメント演算子は副作用完了点に達するまでのどの段階で働いても
構わない事になっているからである。

もっと言えば>>518の動作は未定義である。

527 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:18:11 ]
>>525
なんで start ってするの?compile したのは a.exe とかじゃない?

ところでその本には int main(void) 推奨なの?

528 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:19:57 ]
start.cをコンパイルしたからstart.exeなんじゃないの

529 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:21:51 ]
start.cなんだからbcc32ならstart.exe吐いてくれるはず

まあたぶん./startってやったら動くんじゃない



530 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:24:31 ]
例えば

#include <iostream>
int main()
{
int i = 1;
std::cout << i << ' ' << ++i << std::endl;
}

のようなプログラムは "1 2" と出力しそうであるが、実際は未定義動作であり、
無理矢理動かすと大抵のコンパイラでは直感に反して"2 2"と表示されるのも
同じ理由による。

531 名前:デフォルトの名無しさん [2008/07/30(水) 00:25:04 ]
読み返して言葉足らずでした。補います。
printf("hello");では上記URLのようにexeと、badが同時に出現し、また何も表記が無い状態でしたが
printf("hello\n");では「HELLO」が改行ありで表記されました。
また、printf("%d",100); printf("円\n");では改行ありで「100円」が表記されました。
私の見解では、ただ単に参考にした構文が間違っている(\nが必要だが書かれていなかっただけ)
のだと思いますが。。。意見を聞かせてください。

532 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:26:06 ]
コマンドプロンプトにstartってコマンドあるから
start.exeはまずくない?

533 名前:デフォルトの名無しさん [2008/07/30(水) 00:26:14 ]
>>531
printfのあとに
fflush();つけたらどうなるかな?

534 名前:533 mailto:sage [2008/07/30(水) 00:27:06 ]
いろいろ間違えたごめん忘れてください

535 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:27:24 ]
(なぁなぁ、badって何?)

536 名前:デフォルトの名無しさん [2008/07/30(水) 00:32:52 ]
あ、startじゃぁまずいですか^^;
aに変えました。そしたらbatのみになりました。
参考元URL:homepage3.nifty.com/mmgames/c_guide/index.html
しかも、printf("hello");で改行なし「hello」が表示されました。
お騒がせ申し訳ありません。m(--)m参考元さんも申し訳ありません。m(--)m


537 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:42:51 ]
unixでtestという実行ファイルを作ってハマった当時の俺

538 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 00:44:24 ]
あるある
うん。あるある

539 名前:デフォルトの名無しさん [2008/07/30(水) 00:44:46 ]
batやらbadやら恥ずかしいことばかり書き込んでしまいました。
セキュリティーホールがあれば入りたいです。
startをaに変更すると、
www-2ch.net:8080/up/download/1217345861729515.WpasSs
な感じになりました。これで夜も安心して眠れます。

>>527 startにしたのは無知だからでした。「手始めにスタート」のつもりでした。
この本というかサイトではそうでした。他のサイトを見てみると他の記述もありましたが、
最初に見たこのサイトの記述で貫こうと思います。

>>532 決定的な回答ありがとうございます。小鳥の1歩ほど前進することができました。
終わりなきC言語を心ゆくまで堪能したいと思います。親切にしてくださってありがとうございます。

>>534 いっしょにセキュリティーホールに入りませんか。

>>535 完全に撃ち間違いです。申し訳ありま栓。





540 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:16:56 ]
すいません質問です。
ソラリスでは使えてたのですが、Linuxだとエラーが出てしまってgoogle検索したのですがいい対応策が見つかりません。

newとdeleteは演算子なのですが、

string * aaa;
というのを.hで宣言し
.ccにて
コンストラクタでNULLクリア
main処理にて値を入れる場合と入れない場合があるのですが、
値を入れない場合に、
デストiラクタでaaaをdeleteしようとすると、落ちてしまいます。
SolarisからLinuxに入れ替えようとしているので、Solarisでは通るのにLinuxでは通らないという事はあるのでしょうか。
簡単にプログラムの例を
classで、
string * aaa;  を宣言しておき、

コンストラクタで、aaaをNULL初期化します。
mainルーチンで、aaaにファイルから文字列を取得するのですが、
該当しない場合はaaaはNULLのままとなっています。
デストラクタで、
if(aaa){
delete aaa;
}
とやっているのですが、そこで落ちてしまいます。
よろしければアドバイスお願いします。







541 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:19:23 ]
コンパイラはgccです

542 名前:デフォルトの名無しさん [2008/07/30(水) 02:19:37 ]
VC++を使用しているのですが、
char ItemObject[1024];
ItemObject = "TEST";
listBox->Items->Add(ItemObject);
とするとコンパイルできません。
プログラミング初心者で、どうすればいいのか分からず困っています。
どなたか、助けて下さい。よろしくお願いします。


543 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:20:01 ]
delete演算子は対象のポインタが 0 の時は何もしないで
戻るようになっている。

従って if文は不要。原因は他の所にあるのではないか。

544 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:23:19 ]
>>542
listBox->Items->Add( gcnew System::String(ItemObject) )

はじめから System::Stringを使え。
それより、このスレはC++/CLIはOKなのかな?C++/CLIはC++とは別物だから明記しておくように。

545 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:28:22 ]
>>543
>>delete演算子は対象のポインタが 0 の時は何もしないで
>>戻るようになっている。
これは知ってはいたのですが、チェックしてしまうクセがついてしまっています。

>>従って if文は不要。原因は他の所にあるのではないか。
やはり原因は他にあるのですかね。
Soralisで通っててLinuxでは通らないので、規格の違いかと思い質問させてもらいました。
(LinuxはSoralisと比べて厳しいので
もうちょっと調べてみます。

アドバイスありがとうございます。


546 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:29:17 ]
>>540
クラスも無いのにコンストラクタとか言ってるのがおかしい。ソース晒せ。

547 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:33:41 ]
memsetでクリアしてたりする?

548 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:39:30 ]
>>546
class hoge{
string * aaa;
}

mainでaaaに文字列を取得
(ない場合は取得しない

hoge::hogeでaaaにはNULLを設定

oge::~hogeで
if(aaa){
delete aaa;
}

としています。

>>547
>>memsetでクリアしてたりする?
memsetはやっていないですね。

文字列取得にはc_str()を使用しています。


549 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:42:52 ]
>>548
hoge にデストラクタもコンストラクタもねーじゃねーか。
ソースを省くな。問題が再現する完全なコードを貼れ。



550 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:51:20 ]
>>549
すいません、完全なコードを張る事ができないので省略してました。
何かしらヒントでもあればと思い質問しました。
SoralisとLinuxの互換性がまだ完全に把握できていないので
分かる人がいればと思い。

もうちょっと自分で調べてみます。解決したら役に立つかわかりませんが書き込みます。

551 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 02:59:06 ]
>>550
問題が再現する最小のコードを作ってもらわないと、エスパーでもなけりゃわからない。
OS間の互換性に原因があると思ってるようだが、どうせ違う。

そういうコード作るのは相談のためでもあるが、基本的な調査の方法でもあるんで、
たいていは作ってる間に自分で気づくんだけどな。

552 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:10:02 ]
全くのあてずっぽうだが、
hogeが意図せずコピーコンストラクタでコピーされてて、
2箇所でaaaがdeleteされているとかないだろうか。
deleteしたばかりで領域が再利用されていない場合に
2回目のdeleteでもエラーにならない処理系は存在する。
Soralisが落ちない処理系で、linuxが落ちる処理系だとすると・・

553 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:19:04 ]
>>552
一応gdbでも処理追ってみたのでコンストラクタが2度通ってる事はないみたいです。


554 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:23:12 ]
privateでコピーコンストラクタをきってみたら?
デフォルトのコピーコンストラクタが使われているなら、
普通のコンストラクタは通らないよ。

stringがstl::stringだったらポインタで持つ意味があるのかは検討したほうがいいな。

555 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:26:42 ]
>>554
なるほどprivateもありですね。試してみます。
stringはstd::stringです。


556 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:49:12 ]
OSが違ったら通らないではなくて、Solarisではたまたまエラーが
出なくてLinuxではしっかりチェックされて落ちるってオチだろうな。

多分ソースにバグがある。

557 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:58:01 ]
>>556
その可能性大ですね。
Solarisはチェックが甘いからたまたま通ってただけな気がします。
時間あるから作り直そうかな。他にもありそうですし。

元々作った人が逃げて改修まかされて困ったもんです。



558 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 03:58:37 ]
Solarisはdeleteした領域を触っても落ちないからね。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<131KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef