質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2926閲覧

Graphics::TBitmap の破棄時の処理について

juam

総合スコア26

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/02/21 09:26

C++builder6というレガシーな開発環境を利用してWindowsアプリケーションの作成を行っています。
私が行っている作業は既存のソースコードに対し機能追加を行うというもので、当該アプリケーションは約10年継続しており、開発環境もバージョンアップせずそのままの使っているプロジェクトに途中参加した形になります。

現在アプリケーションにメモリリークの疑いがあり調査をしています。
当該アプリケーションはビットマップを扱うのですが、そこに問題がないか自身が持てないでいます。

処理としては
Graphics::TBitmap *bmp
で宣言した後
bmp = new Graphics::TBitmap();
で生成しています。

目的の処理を行った後
delete bmp;
bmp = NULL;
のように破棄しているのですが、ネットを検索するとサンプルとして
bmp->Free()
としている所が散見されました。
生成~破棄までは1つの関数内で完結しています。

破棄の処理としてはどちらが正しいでしょうか?

古いためかネット検索でも目的の情報がなかなか見つからず
ご存知の方がいらっしゃいましたらご教授願えませんでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

この Graphics::TBitmap は C++ Builder のクラスライブラリ(VCL)が独自で定義しているクラスで、直接 Windows GDI オブジェクトである Windows::TBitmap とは異なります。

VCL は割ときちんとデストラクタで処理するので delete で問題無いかと思いますが、Windows::TBitmap だと後始末がいろいろあったりするので、デストラクタではなく Free を呼び出さねばならない、とかだったような。
最終的には Graphics::TBitmap のデストラクタと free() の実装を見ないと判断できないですが。

※この GDI オブジェクトが出てくると、最新の VC# であっても明示的な解放動作が必要になります、余談ですが。

投稿2017/02/21 09:42

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

juam

2017/02/22 00:56

tacsheaven様 ご回答ありがとうございました。 公式のサンプルで例外発生時のdeleteしているということはFree()は特に必要なさそうだということがわかりました。 補足についてもありがとうございます。 勉強になります。
guest

0

こんにちは。

bmp=new Graphics::TBitmap;で獲得したポインタはdelete bmp;しないとリークする筈です。
bmp->free()しただけでは、Graphics::TBitmapのインスタンス(*bmp)は解放されませんので。

公式サイトもビットマップへの描画のようにnew→deleteしてました。

投稿2017/02/21 10:09

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

juam

2017/02/22 00:58

Chironian様 ご回答ありがとうございます。 公式へのリンクありがとうございました。 C++としてはnew→deleteは基本だと思うのですが、Free()しているサイトを見てしまい困惑していました。 まだ勉強が足りないですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問