[c#]メモリリーク?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
cgg-gam

[c#]メモリリーク?

#1

投稿記事 by cgg-gam » 5年前

Bitmapを画面に表示するプログラムを書いたのですが、
Image = DX.CreateGraphFromMem(p, buff.Length);
の部分でメモリの使用量が増えてしまします。
何が原因なのでしょうか?

コード:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.MemoryMappedFiles;
using System.IO;

using DxLibDLL;

namespace app
{
    public partial class Form1 : Form
    {
        public Form1()
        {
		    int Image;
            InitializeComponent();

            //dxライブラリ描画先
            DX.SetUserWindow(this.Handle);
            //dxライブラリ初期化
            DX.DxLib_Init();
            // 描画先を裏画面にする
            DX.SetDrawScreen(DX.DX_SCREEN_BACK);
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            DX.DxLib_End();
        }

        public void MainLoop()
        {            
            DX.ClsDrawScreen();// 画面に描かれているものを一回全部消す
            this.Draw();
            DX.ScreenFlip();   // 裏画面の内容を表画面に反映させる
        }

        public void FrameReady(...)
        {
	     Bitmap bitmap = e.Bitmap;
            // Bitmapからグラフィックを作成
            using (MemoryStream ms = new MemoryStream())
            {
                bitmap.Save(ms, ImageFormat.Bmp);
                byte[] buff = ms.ToArray();
                
                unsafe
                {
                    fixed (byte* p = buff)
                    {
                        DX.SetDrawValidGraphCreateFlag(DX.TRUE);
                        DX.SetDrawValidAlphaChannelGraphCreateFlag(DX.TRUE);

                        Image = DX.CreateGraphFromMem(p, buff.Length);

                        DX.SetDrawValidGraphCreateFlag(DX.FALSE);
                        DX.SetDrawValidAlphaChannelGraphCreateFlag(DX.FALSE);
                    }                    
                }
            }
        }

        void Draw(){
            DX.DrawGraph(0, 0, Image, 0);           
        }

    }
}


アバター
nullptr
記事: 239
登録日時: 8年前

Re: [c#]メモリリーク?

#2

投稿記事 by nullptr » 5年前

まず「メモリリーク」という言葉の意味を調べて下さい。
そして画像を作ればメモリの使用量が増えるのは不思議なことでしょうか。
 
 
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
?
Is the は :
order C++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

cgg-gam

Re: [c#]メモリリーク?

#3

投稿記事 by cgg-gam » 5年前

プログラミングにおけるバグの一種。プログラムが確保したメモリの一部、または全部を解放するのを忘れ、確保したままになってしまうことを言う。

使用量が増えるのはあたりまえです。
ただそれをどのように解決するかが問題なのです。

アバター
みけCAT
記事: 6309
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: [c#]メモリリーク?

#4

投稿記事 by みけCAT » 5年前

FrameReadyはKinect関連のメソッドでしょうか?
新しい画像を入れる前に前の画像を消してはいかがでしょうか?

コード:

        public void FrameReady(...)
        {
	     Bitmap bitmap = e.Bitmap;
            // Bitmapからグラフィックを作成
            using (MemoryStream ms = new MemoryStream())
            {
                bitmap.Save(ms, ImageFormat.Bmp);
                byte[] buff = ms.ToArray();
                
                unsafe
                {
                    fixed (byte* p = buff)
                    {
                        DX.SetDrawValidGraphCreateFlag(DX.TRUE);
                        DX.SetDrawValidAlphaChannelGraphCreateFlag(DX.TRUE);

                        DX.DeleteGraph(Image); // 無効なハンドルを入れても多分関数が失敗するだけでしょう(適当)
                        Image = DX.CreateGraphFromMem(p, buff.Length);

                        DX.SetDrawValidGraphCreateFlag(DX.FALSE);
                        DX.SetDrawValidAlphaChannelGraphCreateFlag(DX.FALSE);
                    }                    
                }
            }
        }
※テストしていません
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

cgg-gam

Re: [c#]メモリリーク?

#5

投稿記事 by cgg-gam » 5年前

ありがとうございます。
上記のコードで解決しました。

閉鎖

“C言語何でも質問掲示板” へ戻る