Wyciek pamięci.

0

Mam taką funkcję:

 int i_func_call(int iArg1, int iArg2)
{
	int *pi_result;

	pi_result = new int();
	*pi_result = iArg1 + iArg2;

	return (*pi_result);
}

int main()
{

	int a = i_func_call(4, 5);

	std::cout << a;

    return 0;
}

Chciałbym dobrze zrozumieć czemu powoduje ona wyciek pamięci.

  1. Bo zmienna pi_result jest lokalna i jest usuwana po wykonaniu funkcji?
  2. Bo nigdzie nie usuwam pi_result.
  3. Jakiś inny powód?
2

pi_result nie jest tutaj problemem. Jej czas życia jest automatyczny (kończy się przy }). Problemem jest pamięć zaalokowana w tej linii:

    pi_result = new int();

W skrócie: każde wywołanie new musi mieć odpowiednie wywołanie delete. Istotna sprawa: pi_result jest zmienną typu wskaźnikowego. Nie jest tożsama z przypisaną jej wartością (wynikiem wykonania new).

Dodatkowo: używanie nagiego new (a szczególnie delete) to antyidiom w nowoczesnym C++. Tutaj jest zupełnie zbędne, a ogółem masz kontenery standardowe, masz smart pointery. Nie używaj new jeśli nie musisz - a bardzo rzadko musisz.

2

Zmienna pi_result jest lokalna i jest usuwana po wykonaniu funkcji. Ale dotyczy to tylko samego wskaźnika.
Pamięć, którą przydzielasz operatorem new nie jest nigdzie zwalniana - brakuje delete.

1

Masz new, ale nie masz odpowiadającego mu delete.
Najlepszy sposób by to poprawić (C++11):

int i_func_call(int iArg1, int iArg2)
{
	auto pi_result = std::unique_ptr<int>(new int);
	*pi_result = iArg1 + iArg2;
	return (*pi_result);
}

Różnica niewielka, ale masz gwarancję, że pamięć zostanie zwolniona bez względu na to jak zmienisz przepływ kodu.

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