Вы не должны использовать malloc
и free
, если вы не взаимодействуете с кодом C. Старайтесь также избегать new
и delete
, поскольку в C ++ есть много более простых шаблонов, которые гарантированно не пропускают и работают так же быстро. Подумайте о std::vector
и, если vector
не достаточно хорош, подумайте о std::unique_ptr<int[]> narr
с std::make_unique<int[]>(size)
.
Ваша программа не протекает и не падает по чистой случайности. Чтобы избежать утечек, у вашего класса должен быть четкий инвариант относительно памяти, а у него его нет. Невозможно узнать, когда narr
имеет недопустимый указатель или когда он указывает на память, которая должна быть освобождена. В результате следующие утечки:
int arr1[size] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
BubbleSort sort = BubbleSort::BubbleSort(size, arr1);
int* narr = sort.Sort();
narr = sort.Sort();
И следующее имеет неопределенное поведение (бесплатно по неинициализированному указателю):
int arr1[size] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
BubbleSort sort = BubbleSort::BubbleSort(size, arr1);
return 0;
Самый простой способ (и правильный в 99,9% случаев) справиться с этим - определить собственника. Вы решаете заранее, кому принадлежит какой объект. С std::vector
и std::unique_ptr
язык решает это за вас. Язык не позволяет случайно передать право собственности на std::unique_ptr
без явного действия с вашей стороны. Если вы допустили ошибку, компилятор просто выдаст вам ошибку.
Примечание : если вы хотите изучать C ++, то, когда вы выходите из фона C, может быть проще начать с
malloc
,
free
,
printf
и необработанных указателей повсюду. Однако вы должны помнить, что это не идиоматический C ++. Рано или поздно вы должны перейти на идиомы C ++, такие как RAII, классы с явным владением и инвариантом, и использовать библиотеку C ++ вместо C.