힙 메모리를 사용하는데는
이 있는데 Safer C++ style을 사용해야한다.
C style의 경우
#include <stdlib.h>
#include <iostream>
using namespace std;
class Cat {
public:
Cat() {
cout << "meow" << '\n';
};
~Cat() {
cout << "bye" << '\n';
};
private:
int mAge;
}
int main() {
int * ip = (int *)malloc(sizeof(int));
*ip = 100;
free(ip);
// heap 배열
int * iap = (int *)malloc(sizeof(int)*5);
*iap[0] = 100;
free(iap);
// heap 클래스
Cat * catp = (Cat *)malloc(sizeof(Cat));
free(catp);
Cat * catap = (Cat *)malloc(sizeof(Cat)*5);
free(catap);
}
C style의 경우 Constructor와 Destructor가 불러지지 않는다(객체를 만들면 안된다)
C++ style의 경우
#include <stdlib.h>
#include <iostream>
using namespace std;
class Cat {
public:
Cat() {
cout << "meow" << '\n';
};
~Cat() {
cout << "bye" << '\n';
};
private:
int mAge;
}
int main() {
int * ip = new int;
*ip = 100;
delete ip;
// heap 배열
int * iap = new int[5];
*iap[0] = 100;
delete iap;
// heap 클래스
Cat * catp = new Cat;
delete catp;
Cat * catap = new Cat[5];
delete [] catap;
}
만약 프로그래밍 과정에서 delete를 빼먹으면 메모리를 해제하는 과정이 없으므로 memory leak이 일어나게 된다.
이를 근본적으로 막기 위해서는 smart pointer를 사용해야한다.
Safer C++ style
#include <iostream>
#include <memory>
#include <vector>
class Cat
{
public:
Cat()
{
std::cout << "meow" << std::endl;
};
~Cat()
{
std::cout << "bye" << std::endl;
};
};
int main()
{
std::unique_ptr<Cat> catp = std::make_unique<Cat>();
std::vector<Cat> cats(5);
std::unique_ptr<int> ip = std::make_unique<int>();
*ip = 100;
std::vector<int> ints(5);
ints[0]= 100;
}