Kasowanie obiektów a zwolnienie pamięci RAM.

0

Witam, poszukuje rozwiązania na swój problem.
W przycisku Button1 wykonuje funkcje:

TCanvas *pCanvas =  new TCanvas();
Graphics::TBitmap *Bmp = new Graphics::TBitmap;
….
….
….
delete pCanvas, Bmp;

Problem polega na tym, że przy każdym kliknięciu przycisku zwiększa się zużywany zasób prywatny pamięci RAM. Po wielokrotnym (tysięcznym) wyskakuje komunikat „out of system resources”.

Proszę o pomoc w rozwiązaniu problemu. Jak oczyścić pamięć po wykasowaniu obiektów.

0

robisz to dobrze ale pewnie gdzieś wcześniej wychodzisz z funkcji. Poczytaj o std::unique_ptr i std::shared_ptr.

0

Jednak będę się czepiał tej części kodu. Dla przykładu zrobiłem nowy projekt, w nim dodałem tylko Button i prosty test czyli robienie screen`a. Przy każdym kliknięciu program dokłada sobie pamięci prywatnej RAM.

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TCanvas *mojCanvas =  new TCanvas();
 Graphics::TBitmap *mojaBitmapa = new Graphics::TBitmap;

 mojCanvas->Handle = GetDC(0);
 mojaBitmapa->Width  = Screen->Width;
 mojaBitmapa->Height = Screen->Height;
 mojaBitmapa->Canvas->CopyRect(Rect(0, 0, mojaBitmapa->Width, mojaBitmapa->Height), mojCanvas, Rect(0, 0, mojaBitmapa->Width, mojaBitmapa->Height));
 mojaBitmapa->SaveToFile("c:\\mojaBitmapa.bmp");

 delete mojCanvas, mojaBitmapa;
}
//---------------------------------------------------------------------------

2

Ponieważ
"delete mojCanvas, mojaBitmapa;"
To jest źle, rozbij to na dwa delaty a jak byś poczytał to o czym napisałem wyżej nawet byś tego nie potrzebował i ustrzegł byś się od razu błędów. że też to przegapiłem na początku jak czytałem tego posta.

0

Bardzo dziękuje za pomoc ;) heh głupie przyzwyczajenie po przecinku a nowa linia załatwiła sprawę. Przyznam nie czytałem o std::unique_ptr i std::shared_ptr., ponieważ pierwsze wyszukania lekki śmietnik dały mi do głowy a troch brak czasu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1