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した領域を触っても落ちないからね。