【初心者歓迎】C/C++室 Ver.57【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.57【環境依存OK】 - 暇つぶし2ch538:デフォルトの名無しさん
08/07/30 00:44:24
あるある
うん。あるある

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

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

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

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

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



540:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/30 02:19:23
コンパイラはgccです

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


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

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

544:デフォルトの名無しさん
08/07/30 02:23:19
>>542
listBox->Items->Add( gcnew System::String(ItemObject) )

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

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

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

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


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

547:デフォルトの名無しさん
08/07/30 02:33:41
memsetでクリアしてたりする?

548:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/30 02:42:52
>>548
hoge にデストラクタもコンストラクタもねーじゃねーか。
ソースを省くな。問題が再現する完全なコードを貼れ。

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

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

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

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

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

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


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

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

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


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

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

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

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



558:デフォルトの名無しさん
08/07/30 03:58:37
Solarisはdeleteした領域を触っても落ちないからね。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch