힙 메모리 예제

김대익·2022년 2월 18일
0

힙 메모리를 사용하는데는

  • C style
  • C++ style
  • Safer C++ style

이 있는데 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;
}

0개의 댓글