簡単なソースです ひとつバグが含まれています

解決


ねずみ  2003-08-07 10:07:29  No: 51910  IP: [192.*.*.*]

「以下のソースに、ひとつバグが含まれています。
具体的には、void func()の中でひとつ処理が抜けています。
このソースはJavaとして動かせばちゃんとうごくそうです。
でも、C++として動かすとコンパイルでエラーになるそうです。」

私、C++を勉強したことがないんです。
このソースの中のバグをさがしていただけませんでしょうか?
これは仕事を依頼してきている会社からの宿題(試されてる??)
なのです。。。


#include <stdio.h>

class Foo
{
public:
        int i;
        Foo(int j) { i = j; }
        Print() { printf("%d", i); }
};

void func()
{
        Foo* foo = new Foo(5);
        foo->Print();
        return;
}

int main()
{
        func();
}

編集 削除
夢幻  2003-08-07 10:23:09  No: 51911  IP: [192.*.*.*]

fooがdeleteされていないのでは? 
しかも、コンパイルエラーではなくコンパイラの「警告」ではないでしょうか?

私もC++は苦手なので違ってたらすみません。

編集 削除
おーい  2003-08-07 10:36:30  No: 51912  IP: [192.*.*.*]

http://cgi.members.interq.or.jp/gold/marken/bbs.htm
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200308/03080027.txt

編集 削除
ねずみ  2003-08-08 10:20:49  No: 51913  IP: [192.*.*.*]

ここに質問を丸投げするべきではなかったようです。
私はこういった掲示板をはじめて使ってみたので、まず、これだけ
たくさんの方たちの意見が短時間でかえってきていることにびっく
りしました。感謝します。自分でも考えるべきだなとおもい、VCで
ビルドしてみました。ビルドして以下のエラーが出ました。
 
--------------------構成: test - Win32 Debug--------------------
コンパイル中...
test.cp
D:\Documents and Settings\annex\デスクトップ\test.cpp(8) : warning C4183: 'Print': メンバ関数定義はコンストラクタ のようですが名前が囲まれたクラスと一致しません。
D:\Documents and Settings\annex\デスクトップ\test.cpp(8) : error C2561: 'Print' : 関数が値を戻すように宣言されていますが、関数定義に 'return' ステートメントがありません。
D:\Documents and Settings\annex\デスクトップ\test.cpp(21) : warning C4508: 'main' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。
cl.exe の実行エラー
 
test.exe - エラー 1、警告 2
 
 Print() { printf("%d", i); }  →  void Print() { printf("%d", i);}
と修正してコンパイルがとおりました。
warning C4508は、
int main()  →  void main()
としてなくなりました。
 
 
--------------------構成: test - Win32 Debug--------------------
コンパイル中...
test.cpp
リンク中...
 
test.exe - エラー 0、警告 0
 
これを宿題を出してきている人にメールしました。
すると、以下の回答がありました。



================================================================
すみません。void 抜けは想定外でした。
宿題を出していながら申し訳ありません。

こちらで用意していた回答は以下の通りです。
-------------------------------------------
  Foo* foo = new Foo(5);

で Foo のオブジェクトを作成しているが、そのオブジェクトが
解放されず、メモリリークを起こしている。

これを解決するためには、

  return;

の直前で、

  delete foo;

を入れると良い。

編集 削除